2012-04-29 120 views
14

我創建了一個WCF服務,但服務WSDL不顯示我的類(複雜類型)。複雜類型不可用wcf wsdl

下面是服務:

[ServiceContract] 
public interface IFedexService 
{ 
    [OperationContract] 
    ShipmentReply CreateMultiFedExShipment(RxRdShipment shipment); 

    [OperationContract] 
    ShipmentReply CreateFedExShipment(RxRdShipment shipment); 
} 

我的類定義是:

[DataContract] 
public class ShipmentReply 
{ 
    [DataMember] 
    public string ReferenceNumber { get; set; } 

    [DataMember] 
    public string MasterTrackingNumber { get; set; } 

    [DataMember] 
    public List<ReplyPackage> Packages { get; set; } 

    [DataMember] 
    public bool Response { get; set; } 

    [DataMember] 
    public RxNotification Notification { get; set; } 
} 

我的問題是我沒有WSDL找到這個ShipmentReply類。我的問題是什麼?

謝謝 Arefin

回答

28

是的,這是正常的WCF。默認情況下,WCF將僅顯示WSDL本身中的操作 - 數據結構記錄在鏈接到WSDL文件的XSD文件中。

我敢打賭,如果你看看你的WSDL,你會看到類似這樣的東西幾乎是在您的WSDL的頂部:

<xsd:schema targetNamespace="http://tempuri.org/Imports"> 
    <xsd:import schemaLocation="http://localhost:8000/HelloIndigo?xsd=xsd0" 
       namespace="http://tempuri.org/" /> 
    <xsd:import schemaLocation="http://localhost:8000/HelloIndigo?xsd=xsd1" 
       namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> 
    <xsd:import schemaLocation="http://localhost:8000/HelloIndigo?xsd=xsd2" 
       namespace="http://schemas.datacontract.org/2004/07/WCF_Simple_Service" /> 
</xsd:schema> 

這些鏈接所需的XSD文件 - 在類型URL到您的瀏覽器中,其中一個(最有可能是數量最多的一個 - 但不一定是那個)將包含您的複雜類型定義。

嘗試在瀏覽器這個URL(適應港口和實際的URL你有什麼):

http://localhost:8080/HelloIndigo?xsd=xsd2 

這應該給你的XSD您的複雜類型

這個功能引起了一些問題在過去的幾年中,一些客戶無法處理這種(100%正確和完美的)語法。因此,在.NET 4.5中,WCF將有一個新參數(...?singlewsdl)輸出包括所有XSD元素的整個WSDL - 有關更多信息,請參閱What's new in WCF 4.5? A single WSDL file

+0

你是對的,謝謝。你能告訴我一件事..當我使用一個不是datacontract的類的屬性時,那麼我必須使用__BackingField,是否有任何好處或你知道的其他東西.. – 2012-04-29 11:20:43

+0

如果你正在使用'[DataContract] &[DataMember]屬性 - 在需要的任何地方使用它們!這是最簡單和最安全的方式 - 其他任何事情都是黑客。 – 2012-04-29 11:46:46

+1

非常感謝。 – 2012-04-30 09:38:19