Унаследованные свойства не отображаются в образце мыла в файле asmx

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

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


person Grinn    schedule 09.12.2009    source источник
comment
Ах, Good Times Jelly Donut Denny Bug снова поражает :)   -  person Matt    schedule 08.02.2012


Ответы (3)


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

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

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

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

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

person Grinn    schedule 12.01.2010
comment
Рад помочь и спасибо за размещение решения. Это то, что нам придется делать самостоятельно, теперь, когда веб-службы ASMX находятся в режиме обслуживания (в соответствии с этой ошибкой Connect). - person John Saunders; 13.01.2010
comment
Я знаю, что этому вопросу много лет, но он больше не доступен ... у кого-нибудь есть копия? - person Ross Presser; 14.07.2014
comment
@RossPresser Возможно, это будет полезно: blog.codinghorror.com/custom-wsdlhelpgenerator- ошибка webroot. Если нет, я нашел его в Google, CustomWsdlHelpGenerator.aspx. Возможно, вы сможете найти ответ, сделав то же самое. - person Grinn; 23.07.2014

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

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


Обновление: OP создал Ошибка подключения для этой проблемы. Эта ошибка была устранена как "не исправляется" 11.01.2010:

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

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

person John Saunders    schedule 10.12.2009
comment
Как я уже сказал, WSDL и все остальное верны, но образцы SOAP (на странице справки) - нет. Наши клиенты используют эту веб-службу, и когда я даю им asmx, они смотрят на нее и сбиваются с толку, потому что она не соответствует нашей документации. Я знаю, что образцы не подходят, но это не очень профессиональный подход со стороны меня, чтобы сказать, кстати, игнорировать наши образцы в asmx. Это ошибка .NET, и мы недостаточно умны, чтобы найти способ ее обойти. - person Grinn; 10.12.2009
comment
Я рекомендую вам определить, является ли это ошибкой и какого рода. Я также рекомендую вам признать, что веб-службы ASMX считаются устаревшей технологией Microsoft, поэтому, если это ошибка, она не будет исправлена. Обратите внимание на то, что WCF не включает страницу справки. - person John Saunders; 10.12.2009
comment
Хорошая точка зрения. Я обязательно должен представить следующую версию этой веб-службы через WCF и просто создать образцы SOAP самостоятельно в сопроводительной документации. Я не уверен, что вы имеете в виду, независимо от того, является ли это ошибкой: образец SOAP не раскрывает все доступные свойства, и если нет способа заставить его раскрыть их ... что еще вы могли бы назови это? Итак, я думаю, что первый шаг к определению, является ли это ошибкой, - это посмотреть, есть ли решение проблемы. Есть ли у кого-нибудь какие-нибудь решения? - person Grinn; 10.12.2009
comment
Я имею в виду, определить, отправляются ли и принимаются ли базовые свойства. Примеры - это просто веб-страница, а не сама услуга. Посмотрите, что на самом деле делает сервис. - person John Saunders; 10.12.2009
comment
Сервис работает нормально. Эти свойства отправляются и принимаются. Проблема видна только в образцах. - person Grinn; 10.12.2009
comment
Затем вы должны сообщить об ошибке на странице connect.microsoft.com/visualstudio и опубликовать URL-адрес в Connect выпуск здесь (чтобы читатели могли проголосовать по этому вопросу). Такая ошибка, по всей вероятности, не будет исправлена, но сообщите об этом. - person John Saunders; 10.12.2009
comment
Спасибо, Джон. Вот ссылка: connect.microsoft.com/VisualStudio/feedback/ - person Grinn; 14.12.2009

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

Улучшение генератора справки веб-службы ASP.NET < / а>

Он использует подход, на который ссылается @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>
person AceJordin    schedule 22.08.2016