2009-12-09 17 views
8

Tengo dos clases, WebServiceRequest y OrderRequest. Cada clase tiene propiedades. OrderRequest hereda de WebServiceRequest - de este modo:Las propiedades heredadas no aparecen en la muestra de jabón en el archivo asmx

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 se expone a través de un WebMethod. Al visualizar WSDL del archivo ASMX que expone OrderRequest (es decir, MyWebService.asmx? WSDL), ambas propiedades están visibles, como deberían ser. Sin embargo, cuando ve el ejemplo SOAP para el método web que expone OrderRequest, solo la propiedad VendorId está visible y no la propiedad heredada AuthenticationToken. ¿Cual es el trato?

Nota: que he publicado este problema como un error en MS conexion: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=520200

+1

Ah, las huelgas "Good Times buñuelo de jalea Denny Bug" de nuevo :) –

Respuesta

4

me las arreglé para tropezar copias de asswords en la solución para mi problema, incluso después de que Microsoft ha confirmado como un error (https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=520200) y me había dado por vencido y marcó la respuesta de Juan como aceptado. Aquí está la solución:

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

ir allí, descargue el archivo, a continuación, añadir la siguiente línea en la sección system.web del archivo Web.config:

<webServices> 
<wsdlHelpGenerator href="CustomWsdlHelpGenerator.aspx"/> 
</webServices> 

La propiedad href debe apuntar a la ubicación relativa de su archivo dentro de su proyecto. Gracias por tu ayuda John.

+0

Me complace ayudar y gracias por publicar la solución. Este es el tipo de cosas que tendremos que hacer por nuestra cuenta, ahora que los servicios web ASMX están en modo de mantenimiento (de acuerdo con ese error de Connect). –

+0

Sé que esta pregunta tiene años, pero ya no está disponible ... ¿alguien tiene una copia? –

+0

@RossPresser Quizás esto sea útil: http://blog.codinghorror.com/custom-wsdlhelpgenerator-webroot-error/. Si no, lo encontré en Google, "CustomWsdlHelpGenerator.aspx". Quizás puedas encontrar una respuesta haciendo lo mismo. – Grinn

2

No debería ser necesario el uso de [XmlInclude].

Pareces estar juzgando que esto es un problema debido a la apariencia de la página de ayuda (lo que obtienes en el navegador cuando pulsas la URL .asmx). No hagas eso. En cambio, mire para ver qué se devuelve realmente.


Actualización: El OP creó un Connect bug para este problema. Este error se resuelve como "no va a arreglar" el 1/11/2010:

Hemos confirmado que los heredados propiedades no aparecen en la muestra de SOAP en el navegador y que es de hecho un error en el producto.

En este punto, esta zona es en modo de mantenimiento, y ningún trabajo activo está previsto.

+2

como he dicho, el WSDL y todo lo demás es preciso - pero las muestras de jabón (en la "página de ayuda ") no son. Este servicio web es consumido por nuestros clientes, y cuando les doy el asmx lo miran y se confunden porque no coincide con nuestra documentación. * Yo * sé que las muestras no son correctas, pero no es muy profesional para que tenga que decir, "por cierto, ignora nuestras muestras en el asmx. Es un error en .NET y no somos lo suficientemente inteligentes como para encontrar una forma de evitarlo ". – Grinn

+0

Te recomiendo que determines si es un error o no, y de qué tipo. También le recomiendo que reconozca que Microsoft considera que los servicios web ASMX son una "tecnología heredada", por lo que si se trata de un error, no se solucionará. Tenga en cuenta que WCF no incluye una página de ayuda. –

+0

Buen punto. Definitivamente debería exponer la siguiente versión de este servicio web a través de WCF y simplemente producir las muestras SOAP en mi documentación adjunta. No estoy seguro de a qué te refieres con "si es un error o no": la muestra SOAP no expone todas las propiedades disponibles, y si no hay forma de causar que las exponga ... ¿qué más? ¿lo llamarías? Entonces, supongo que el primer paso para determinar si se trata de un error es ver si hay una solución al problema. ¿Alguien tiene alguna solución por ahí? – Grinn

0

@ El enlace de Grinn está muerto y googleando CustomWsdlHelpGenerator.aspx no resultó nada útil. Pero me encontré con esto:

Improving the ASP.NET Webservice Help Generator

Se utiliza el enfoque @Grinn se refiere y utiliza un XSL para transformar los datos WSDL para reflejar la herencia.

Desde el enlace:

Obtener la descripción predeterminada generador instalado DefaultWsdlHelpGenerator.aspx (en mi equipo, que se encuentra en C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG) y guardarlo como WsdlHelpGenerator .aspx en el directorio web de su servicio web. Abra su web.config y poner ...

<webServices> 
    <wsdlHelpGenerator href="WsdlHelpGenerator.aspx" /> 
</webServices> 

... dentro de la sección '<system.web>'.

abierto WsdlHelpGenerator.aspx y añadir estos dos métodos directamente debajo del método 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; 
} 

Por último, para obtener el código de trabajo, poner el WsdlHelp.xsl archivo de transformación en el directorio web de su servicio web. Puede parecer de la siguiente manera:

<?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> 
Cuestiones relacionadas