2009-12-09 2 views
8

У меня есть два класса: WebServiceRequest и OrderRequest. Каждый класс имеет свойства. OrderRequest наследует от WebServiceRequest - вот так:Унаследованные свойства не отображаются в образце мыла в 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 экспонируется через WebMethod. При просмотре WSDL файла ASMX, который предоставляет OrderRequest (т. Е. MyWebService.asmx? WSDL), оба свойства видны - как и должно быть. Однако, когда вы просматриваете образец SOAP для Web-метода, который предоставляет OrderRequest, отображается только свойство VendorId, а не унаследованное свойство AuthenticationToken. В чем дело?

Примечание: Я отправил этот вопрос, как ошибка на MS Connect: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=520200

+1

Ах, «Good Times Jelly Donut Denny Bug» удары снова :) –

ответ

4

мне удалось наткнуться обратно-asswords в раствор для моей проблемы, даже после того, как Microsoft подтвердила это как ошибка (https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=520200), и я отказался и отметил ответ Джона, как принято. Вот решение:

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

Go там, скачать файл, а затем добавьте следующую строку в разделе system.web вашего файла Web.config:

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

HREF свойство следует указать к относительному расположению вашего файла в вашем проекте. Спасибо за вашу помощь.

+0

Рад помочь, и спасибо за публикацию решения. Это то, что нам нужно делать самостоятельно, теперь, когда веб-службы ASMX находятся в режиме обслуживания (в соответствии с ошибкой Connect). –

+0

Я знаю, что этот вопрос лет, но это уже не доступно ... у кого-нибудь есть копия? –

+0

@ RossPresser Возможно, это будет полезно: http://blog.codinghorror.com/custom-wsdlhelpgenerator-webroot-error/. Если нет, я нашел его по Google, «CustomWsdlHelpGenerator.aspx». Возможно, вы можете найти ответ, сделав то же самое. – Grinn

2

Это не должно быть необходимо использовать [XmlInclude].

Возможно, вы считаете, что это проблема из-за появления справочной страницы (что вы получаете в браузере, когда вы нажимаете URL-адрес .asmx). Не делай этого. Вместо этого посмотрите, что на самом деле вернулось.


Update: OP создал Connect bug для этого вопроса. Эта ошибка была решена, как «не исправит» на 1/11/2010:

Мы подтвердили, что наследственные свойства не проявляются в SOAP Sample в браузере и что действительно ошибка в продукте.

На данный момент, эта область находится в режиме охранения, и никакой активной работы не планируются.

+2

Как я уже сказал, WSDL и все остальное является точным - но SOAP Образцы (на «странице справки ") не. Этот веб-сервис потребляется нашими клиентами, и когда я даю им asmx, они смотрят на него и сбиты с толку, потому что это не соответствует нашей документации. * Я знаю, что образцы неправильные, но это не очень профессионально, потому что я должен сказать, «кстати, игнорируем наши образцы в asmx. Это ошибка в .NET, и мы недостаточно умны для выяснить путь вокруг него ». – Grinn

+0

Я рекомендую вам определить, является ли это ошибкой и какой вид. Я также рекомендую вам признать, что веб-службы ASMX считаются «устаревшими технологиями» Microsoft, поэтому, если это ошибка, она не будет исправлена. Обратите внимание, что WCF не содержит справочную страницу. –

+0

Хорошая точка. Я должен определенно выставить следующую версию этой веб-службы через WCF и просто подготовить образцы SOAP самостоятельно в своей сопроводительной документации. Я не уверен, что вы имеете в виду, «независимо от того, является ли это ошибкой»: образец SOAP не раскрывает все доступные свойства, и если нет способа заставить его разоблачить их ... что еще Вы бы назвали это? Итак, я предполагаю, что первый шаг к определению того, является ли это ошибкой, - это увидеть, есть ли решение проблемы. Есть ли у кого-нибудь какие-то решения? – Grinn

0

@ Ссылка Гринна мертва и поиск в Google CustomWsdlHelpGenerator.aspx не превратил ничего полезного. Но я наткнулся на это:

Improving the ASP.NET Webservice Help Generator

Он использует подход @Grinn относится к и использует XSL для преобразования данных WSDL для отражения наследования.

Из ссылке:

Получить установленное описание по умолчанию генератор DefaultWsdlHelpGenerator.aspx (на моем компьютере, он находится в C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG) и сохраните его как WsdlHelpGenerator .aspx в веб-каталоге вашего веб-сервиса. Откройте web.config и положить ...

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

... в разделе '<system.web>'.

Открыть 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 в веб-каталоге вашего веб-сервиса. Это может выглядеть следующим образом:

<?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> 
Смежные вопросы