2010-03-03 77 views
2

當我已經定義了下列接口web服務響應是使用MessageContract

[ServiceContract] 
public interface IHealthProducts 
{ 
    [OperationContract()] 
    ResponseClass OrderSelfSignedHealthCertificate(); 
} 

它返回下列類型變成ref參數

[MessageContract] 
public class ResponseClass 
{ 
    [MessageBodyMember] 
    public string AnimalSpeciesCode 
    { 
     get; 
     set; 
    } 

    [MessageBodyMember] 
    public int VBN 
    { 
     get; 
     set; 
    } 
} 

我預期生成的客戶端代碼將暴露OrderSelfSignedHealthCertificate方法通過以下方式:

HealthProductsClient client = new HealthProductsClient(); 
ResponseClass response = client.OrderSelfSignedHealthCertificate(); 

I nstead,ResponseClass的屬性不會包裹在ResponseClass,但暴露就像這樣:

string OrderSelfSignedHealthCertificate(out int VBN) 

當我的DataContract屬性和MessageBodyMember的數據成員屬性交換MessageContract,我得到預期的行爲(ResponseClass響應類型)。 但是我需要MessageContract,因爲我需要將一些屬性放在SOAP頭中。

我做錯了什麼?這是正常的行爲嗎?如何在使用MessageContract時獲得Response類返回類型?

任何幫助非常感謝。

回答

1

當您[MessageContract]包含不止一個[MessageBodyMember],則WCF將返回第一個從服務調用(AnimalSpeciesCode你的情況)的返回值,以及所有其他被返回outref paraemters。

您可以通過只有在您的郵件合同單[MessageBodyMember]封裝你需要有回報的所有項目,像這樣解決這個問題:

[DataContract] 
class CompoundData 
{ 
    public string AnimalSpeciesCode { get; set; } 
    public int VBN { get; set; } 
} 

[MessageContract] 
public class ResponseClass 
{ 
    [MessageBodyMember] 
    public CompoundData Payload { get; set; } 
} 

在這種情況下,CompoundData應爲返回值從您的服務呼叫 - 包含您需要的兩個元素。

1

謝謝馬克,做到了。 我做了一個通用的ResponseWrapper此類類來封裝的返回類型:

[MessageContract(WrapperNamespace = "http://mynamespace.com")] 
public class ResponseWrapper<T> 
{ 
    [MessageBodyMember(Namespace = "http://mynamespace.com")] 
    public T Response 
    { 
     get; 
     set; 
    } 
} 

我已經定義OrderSelfSignedHealthCertificate的返回類型是

ResponseWrapper<ResponseClass> OrderSelfSignedHealthCertificate(); 

在我的客戶端代碼,這轉化爲

ResponseClass OrderSelfSignedHealthCertificate(); 

這是我想要的。謝謝!

+0

請更新您的問題,而不是添加答案,除非您確實找到答案。 –

0

我已發佈此問題的後續跟進here。 使用MessageContract時,通用返回類型命名不正確。