Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承的属性不会出现在asmx文件的soap示例中_C#_Asp.net_Web Services_Inheritance_Asmx - Fatal编程技术网

C# 继承的属性不会出现在asmx文件的soap示例中

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

我有两个类,WebServiceRequest和OrderRequest。每个类都有属性。OrderRequest继承自WebServiceRequest,如下所示:

    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>