2009-12-09 57 views
8

Tôi có hai lớp, WebServiceRequest và OrderRequest. Mỗi lớp có các thuộc tính. OrderRequest thừa hưởng từ WebServiceRequest - như vậy:Các thuộc tính kế thừa không xuất hiện trong mẫu xà phòng trên tập tin 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 được tiếp xúc thông qua một WebMethod. Khi xem WSDL của tệp ASMX để hiển thị OrderRequest (nghĩa là MyWebService.asmx? WSDL), cả hai thuộc tính đều hiển thị - như chúng cần. Tuy nhiên, khi bạn xem mẫu SOAP cho Phương thức Web hiển thị OrderRequest, chỉ có thuộc tính VendorId được hiển thị và không phải thuộc tính AuthenticationToken được thừa hưởng. Thỏa thuận là gì?

Lưu ý: tôi đã đăng vấn đề này như là một lỗi trên MS Connect: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=520200

+1

Ah, "Good Times Jelly Donut Denny Bug" đình công lần nữa :) –

Trả lời

4

Tôi đã tìm cách giải quyết vấn đề của mình, ngay cả sau khi Microsoft xác nhận đó là lỗi (https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=520200) và tôi đã từ bỏ và đánh dấu câu trả lời của John là được chấp nhận. Dưới đây là giải pháp:

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

Go đó, tải file, sau đó thêm dòng sau dưới phần system.web của file Web.config của bạn:

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

Thuộc tính href phải chỉ đến vị trí tương đối của tệp trong dự án của bạn. Cảm ơn sự giúp đỡ của bạn John.

+0

Rất vui được trợ giúp và cảm ơn bạn đã đăng giải pháp. Đây là loại điều chúng tôi sẽ phải làm một mình, giờ đây dịch vụ web ASMX đang ở chế độ bảo trì (theo lỗi Kết nối). –

+0

Tôi biết câu hỏi này là năm cũ, nhưng điều này không còn khả dụng ... có ai có bản sao không? –

+0

@RossPresser Có lẽ đây sẽ là dịch vụ: http://blog.codinghorror.com/custom-wsdlhelpgenerator-webroot-error/. Nếu không, tôi tìm thấy nó bởi Googling, "CustomWsdlHelpGenerator.aspx". Có lẽ bạn có thể tìm thấy câu trả lời bằng cách làm như vậy. – Grinn

2

Nó không phải là cần thiết để sử dụng [XmlInclude].

Có vẻ như bạn đang xem xét vấn đề này vì sự xuất hiện của trang trợ giúp (những gì bạn nhận được trong trình duyệt khi bạn nhấn URL .asmx). Đừng làm thế. Thay vào đó, hãy nhìn xem những gì thực sự được trả về.


Cập nhật: Các OP tạo ra một Connect bug cho vấn đề này. Lỗi này đã được giải quyết là "sẽ không sửa chữa" trên 1/11/2010:

Chúng tôi đã xác nhận rằng kế thừa tính không hiển thị trong SOAP mẫu trên trình duyệt và đó là thực sự là một lỗi trong sản phẩm.

Tại thời điểm này, khu vực này ở chế độ bảo trì duy trì và không hoạt động được lên kế hoạch.

+2

Giống như tôi đã nói, WSDL và mọi thứ khác là chính xác - nhưng mẫu SOAP (trên "trang trợ giúp ") không. Dịch vụ web này được khách hàng của chúng tôi tiêu thụ và khi tôi cung cấp cho họ asmx họ nhìn vào nó và bị nhầm lẫn vì nó không khớp với tài liệu của chúng tôi. * Tôi * biết các mẫu không đúng, nhưng nó không phải là rất chuyên nghiệp tìm kiếm tôi phải nói, "bằng cách này, bỏ qua các mẫu của chúng tôi trên asmx. Đó là một lỗi trong .NET và chúng tôi không đủ thông minh để tìm ra cách xung quanh nó. " – Grinn

+0

Tôi khuyên bạn nên xác định xem đó có phải là lỗi hay không và loại nào. Tôi cũng khuyên bạn nên nhận ra rằng các dịch vụ web ASMX được Microsoft coi là "công nghệ kế thừa", vì vậy nếu đó là lỗi, nó sẽ không được sửa chữa. Lưu ý cách WCF không bao gồm một trang trợ giúp. –

+0

Điểm tốt. Tôi chắc chắn nên phơi bày phiên bản tiếp theo của Dịch vụ Web này qua WCF và chỉ tự mình tạo ra các mẫu SOAP trong tài liệu đi kèm của tôi. Tôi không chắc chắn ý của bạn là gì, "dù đó có phải là một lỗi" hay không: Mẫu SOAP không phơi bày tất cả các thuộc tính sẵn có, và nếu không có cách nào để khiến nó lộ ra ... bạn sẽ gọi nó Vì vậy, tôi đoán bước đầu tiên để xác định nếu đó là một lỗi là để xem nếu có một giải pháp cho vấn đề. Có ai có bất kỳ giải pháp ra khỏi đó? – Grinn

0

@ Liên kết Grinn đã chết và googling CustomWsdlHelpGenerator.aspx không biến bất kỳ thứ gì hữu ích. Nhưng tôi đi qua này:

Improving the ASP.NET Webservice Help Generator

Nó sử dụng cách tiếp cận @Grinn đề cập đến và sử dụng một XSL để chuyển đổi dữ liệu WSDL để phản ánh thừa kế.

Từ liên kết:

Lấy cài đặt máy phát điện mô tả mặc định DefaultWsdlHelpGenerator.aspx (trên máy tính của tôi, đó là trong C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG) và lưu nó như WsdlHelpGenerator .aspx trong thư mục web của dịch vụ web của bạn. Mở web.config của bạn và đặt ...

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

... bên trong '<system.web>' phần.

mở WsdlHelpGenerator.aspx và thêm hai phương pháp trực tiếp dưới phương pháp 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; 
} 

Cuối cùng, để có được mã này làm việc, đặt các tập tin chuyển đổi WsdlHelp.xsl vào thư mục web của webservice của bạn. Nó có thể trông như sau:

<?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> 
Các vấn đề liên quan