我有两个类,WebServiceRequest和OrderRequest。每个类都有属性。 OrderRequest继承自WebServiceRequest - 如下所示:
public class WebServiceRequest
{
private string mAuthenticationToken;
public string AuthenticationToken
{
get { return mAuthenticationToken; }
set { mAuthenticationToken = value; }
}
...
}
public class OrderRequest : WebServiceRequest
{
private string mVendorId;
public string VendorId
{
get { return mVendorId; }
set { mVendorId = value; }
}
...
}
OrderRequest通过WebMethod公开。在查看公开OrderRequest的ASMX文件的WSDL(即MyWebService.asmx?WSDL)时,两个属性都是可见的 - 正如它们应该的那样。但是,当您查看公开OrderRequest的Web方法的SOAP示例时,只有VendorId属性可见,而不是继承的AuthenticationToken属性。这是什么交易?
注意:我已将此问题发布为MS Connect上的错误:https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=520200
答案 0 :(得分:4)
即使在微软确认它是一个错误(https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=520200)并且我已经放弃并将John的答案标记为已被接受之后,我设法绊倒了我的问题的解决方案。这是解决方案:
http://code.msdn.microsoft.com/WsdlHelpGenerator/Release/ProjectReleases.aspx?ReleaseId=412
去那里,下载文件,然后在Web.config文件的system.web部分下添加以下行:
<webServices>
<wsdlHelpGenerator href="CustomWsdlHelpGenerator.aspx"/>
</webServices>
href属性应指向文件在项目中的相对位置。谢谢你的帮助约翰。
答案 1 :(得分:2)
没有必要使用[XmlInclude]
。
由于帮助页面的外观(当您点击.asmx网址时浏览器中显示的内容),您似乎认为这是一个问题。不要那样做。相反,请查看实际返回的内容。
<强>更新强> OP为此问题创建了Connect bug。此错误在2010年1月11日解决为“无法解决”:
我们已经确认继承了 属性不会显示在SOAP中 浏览器上的示例即是 确实是产品中的一个错误。
此时,这个区域就在 维护模式,没有活动工作 计划好了。
答案 2 :(得分:1)
@ Grinn的链接已经死了,谷歌搜索CustomWsdlHelpGenerator.aspx并没有变得有用。但我偶然发现了这个:
Improving the ASP.NET Webservice Help Generator
它使用@Grinn引用的方法并使用XSL转换Wsdl数据以反映继承。
从链接:
获取已安装的默认描述生成器DefaultWsdlHelpGenerator.aspx(在我的计算机上,它位于C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG中)并将其保存为Web中的WsdlHelpGenerator.aspx您的Web服务的目录。打开你的web.config并输入......
<webServices>
<wsdlHelpGenerator href="WsdlHelpGenerator.aspx" />
</webServices>
...在&#39;&lt; system.web&gt;&#39;内部分。
打开WsdlHelpGenerator.aspx并在Page_Load方法的正下方添加这两个方法:
protected override void OnPreLoad(EventArgs e) {
base.OnPreLoad(e);
// transform any service description stored within HttpContext
// cf. Page_Load: try "wsdlsWithPost" first and fall back to "wsdls"
string key = Context.Items["wsdlsWithPost"] != null ?
"wsdlsWithPost" : "wsdls";
serviceDescriptions = (ServiceDescriptionCollection)Context.Items[key];
TransformServiceDescriptions(ref serviceDescriptions);
Context.Items[key] = serviceDescriptions;
}
void TransformServiceDescriptions(ref ServiceDescriptionCollection descriptions) {
// modify each description by an XSLT processor
ServiceDescriptionCollection transformed = new ServiceDescriptionCollection();
System.Xml.Xsl.XslCompiledTransform xslt =
new System.Xml.Xsl.XslCompiledTransform();
xslt.Load(Server.MapPath("WsdlHelp.xsl"));
foreach (ServiceDescription desc in descriptions)
{
// load original WSDL data
MemoryStream ms1 = new MemoryStream(), ms2 = new MemoryStream();
desc.Write(ms1);
// process WSDL data using WsdlHelp.xsl
ms1.Position = 0;
xslt.Transform(new System.Xml.XPath.XPathDocument(ms1), null, ms2);
// replace current WSDL data with the transformed stream
ms2.Position = 0;
transformed.Add(ServiceDescription.Read(ms2));
ms1.Dispose();
ms2.Dispose();
}
descriptions = transformed;
}
最后,要使此代码正常工作,请将转换文件WsdlHelp.xsl放入Web服务的Web目录中。它可能如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:s="http://www.w3.org/2001/XMLSchema">
<xsl:output
method="xml"
indent="no"
encoding="utf-8"
omit-xml-declaration="no"
/>
<!-- recursively dissolve any schema extension elements to the base structure -->
<xsl:template match="/" xml:space="default">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="*" priority="0.5" xml:space="default">
<xsl:copy>
<xsl:copy-of select="attribute::*" />
<xsl:choose>
<xsl:when test="child::*" />
<xsl:otherwise>
<xsl:value-of select="." />
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates select="child::*" />
</xsl:copy>
</xsl:template>
<xsl:template match="s:complexType" priority="1.0">
<xsl:element name="s:complexType" namespace="http://www.w3.org/2001/XMLSchema">
<xsl:copy-of select="attribute::*" />
<xsl:element name="s:sequence">
<xsl:copy-of select=".//s:sequence/*" />
<xsl:if test="./s:complexContent/s:extension">
<xsl:comment> schema extension expanded: <xsl:value-of
select="./s:complexContent/s:extension/@base"/> </xsl:comment>
<xsl:call-template name="fetch-sequence">
<xsl:with-param name="typename"
select="substring-after(./s:complexContent/s:extension/@base,':')" />
</xsl:call-template>
</xsl:if>
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template name="fetch-sequence">
<xsl:param name="typename" />
<xsl:copy-of select="//s:complexType[@name = $typename]//s:sequence/*" />
<xsl:if test="//s:complexType[@name = $typename]/s:complexContent/s:extension">
<xsl:call-template name="fetch-sequence">
<xsl:with-param name="typename"
select="substring-after(//s:complexType[@name = $typename]
/s:complexContent/s:extension/@base,':')" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>