inheritance的属性不会出现在asmx文件的soap示例中

我有两个类,WebServiceRequest和OrderRequest。 每个类都有属性。 OrderRequestinheritance自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属性可见,而不是inheritance的AuthenticationToken属性。 这是怎么回事?

注意:我已将此问题作为MS Connect上的错误发布: https : //connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedidID = 520200

即使在微软确认它是一个错误( https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=520200 )并且我已经放弃了之后,我设法绊倒了我的问题的解决方案。并将约翰的回答标记为已接受。 这是解决方案:

http://code.msdn.microsoft.com/WsdlHelpGenerator/Release/ProjectReleases.aspx?ReleaseId=412

去那里,下载文件,然后在Web.config文件的system.web部分下添加以下行:

    

href属性应指向文件在项目中的相对位置。 谢谢你的帮助约翰。

没有必要使用[XmlInclude]

您似乎认为这是一个问题,因为帮助页面的外观(当您点击.asmx URL时在浏览器中获得的内容)。 不要那样做。 相反,请查看实际返回的内容。


更新: OP为此问题创建了一个Connect错误 。 此错误在2010年1月11日解决为“无法修复”:

我们已经确认inheritance的属性不会在浏览器的SOAP Sample中显示,这确实是产品中的错误。

此时,该区域处于维护模式 ,未计划活动工作。

@ Grinn的链接已经死了,谷歌搜索CustomWsdlHelpGenerator.aspx没有变得有用。 但我遇到了这个:

改进ASP.NET Webservice帮助生成器

它使用@Grinn引用的方法并使用XSL转换Wsdl数据以反映inheritance。

从链接:

获取已安装的默认描述生成器DefaultWsdlHelpGenerator.aspx(在我的计算机上,它位于C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG中)并将其保存为Web服务的Web目录中的WsdlHelpGenerator.aspx。 打开你的web.config并把…

    

…在’‘部分内。

打开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目录中。 它可能看起来如下:

                           schema extension expanded: