C# 继承的属性不会出现在asmx文件的soap示例中
我有两个类,WebServiceRequest和OrderRequest。每个类都有属性。OrderRequest继承自WebServiceRequest,如下所示:C# 继承的属性不会出现在asmx文件的soap示例中,c#,asp.net,web-services,inheritance,asmx,C#,Asp.net,Web Services,Inheritance,Asmx,我有两个类,WebServiceRequest和OrderRequest。每个类都有属性。OrderRequest继承自WebServiceRequest,如下所示: public class WebServiceRequest { private string mAuthenticationToken; public string AuthenticationToken { get { return mA
public class WebServiceRequest
{
private string mAuthenticationToken;
public string AuthenticationToken
{
get { return mAuthenticationToken; }
set { mAuthenticationToken = value; }
}
...
}
OrderRequest通过WebMethod公开。当查看公开OrderRequest的ASMX文件的WSDL(即MyWebService.ASMX?WSDL)时,这两个属性都是可见的——它们应该是可见的。但是,当您查看公开OrderRequest的Web方法的SOAP示例时,只有VendorId属性可见,而继承的AuthenticationToken属性不可见。怎么回事
注意:我已将此问题作为错误发布在MS Connect上:不必使用
[xmlclude]
您似乎认为这是一个问题,因为帮助页面的外观(当您点击.asmx URL时在浏览器中看到的内容)。不要那样做。相反,查看实际返回的内容
更新: 为该问题创建了一个新的解决方案。此错误在2010年1月11日被解决为“无法修复”: 我们已经确认,该公司 属性不会显示在SOAP中 浏览器上的示例,即 事实上,这是产品中的一个缺陷 此时,该区域处于 维护模式,无活动工作 已经计划好了
即使在微软确认这是一个bug()并且我已经放弃并将John的答案标记为已接受之后,我还是设法重新找到了问题的解决方案。以下是解决方案: 转到那里,下载文件,然后在web.config文件的system.web部分下添加以下行:
<webServices>
<wsdlHelpGenerator href="CustomWsdlHelpGenerator.aspx"/>
</webServices>
href属性应指向文件在项目中的相对位置。谢谢你的帮助,约翰。@Grinn的链接已断开,谷歌的CustomWsdlHelpGenerator.aspx没有显示任何有用的内容。但我遇到了这样一个问题: 它使用@Grinn引用的方法,并使用XSL转换Wsdl数据以反映继承 从链接: 获取已安装的默认描述生成器DefaultWsdlHelpGenerator.aspx(在我的计算机上,它位于C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG中),并将其另存为web服务的web目录中的WsdlHelpGenerator.aspx。打开web.config并将
<webServices>
<wsdlHelpGenerator href="WsdlHelpGenerator.aspx" />
</webServices>
最后,为了使这段代码正常工作,将转换文件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>
已扩展架构扩展:
正如我所说,WSDL和其他所有内容都是准确的,但SOAP示例(在“帮助页面”上)却不准确。这个Web服务是由我们的客户使用的,当我给他们asmx时,他们看到它会感到困惑,因为它与我们的文档不匹配。我知道这些示例是不对的,但我不得不说,“顺便说一句,忽略我们在asmx上的示例。这是.NET中的一个bug,我们没有足够的聪明来找出解决它的方法。”我建议您确定它是否是bug,以及是哪种bug。我还建议您认识到,ASMXWeb服务被微软视为“遗留技术”,因此,如果它是一个bug,它将不会得到修复。请注意WCF如何不包含帮助页面。这是一个很好的观点。我肯定应该通过WCF公开这个Web服务的下一个版本,并在附带的文档中自己制作SOAP示例。我不确定你所说的“它是否是一个bug”是什么意思:SOAP示例不会公开所有可用的属性,如果没有办法使它公开它们。。。你还能叫它什么?所以,我想确定这是否是一个bug的第一步是看看是否有解决问题的方法。有人有什么解决方案吗?我的意思是,确定是否发送和接收基本属性。这些示例只是一个网页,而不是服务本身。看看实际的服务是怎么做的,服务很好。这些属性将被发送和接收。此问题仅在示例中可见。很高兴提供帮助,并感谢您发布解决方案。这是我们必须自己做的事情,现在ASMX web服务处于维护模式(根据那个连接错误)。我知道这个问题已经存在多年了,但现在已经不可用了。。。有人有副本吗?@RossPresser也许这会有用:。如果没有,我通过谷歌搜索“CustomWsdlHelpGenerator.aspx”找到了它。也许你也可以通过同样的方法找到答案。啊,“美好时光果冻甜甜圈丹尼·巴格”又来了:)
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;
}
<?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>