2008-09-25 60 views
2

我正在連接到由第三方提供商託管的Web服務。我在我的項目中向Web服務添加了服務引用,VS已生成所有需要的引用和類。Visual Studio生成的服務參考中的XML名稱空間問題

我與這段代碼(客戶端名稱和方法匿名)連接:

using (var client = new Client()) 
{ 
    try 
    { 
     client.Open(); 
     var response = client.Method(...); 
     return response.Status; 
    } 
    catch (SoapException ex) 
    { 
     throw CreateServiceException(ex); 
    } 
    finally 
    { 
      client.Close(); 
    } 
} 

當到達client.Open(),我得到一個異常此消息:

來自 名稱空間的頂部XML元素'_return'引用不同類型 System.Boolean和 Service.Status。 使用XML屬性爲元素 或類型指定另一個 XML名稱或名稱空間。

在reference.cs,我可以看到「_return」變量裝飾有

[System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=0)] 

是否有問題的WSDL,生成的服務參考或在我的代碼?

更新:生成服務作爲一個老派的Web服務解決了這個問題。我已經將Sixto的答案標記爲現在已被接受,但我仍然很好奇可能導致問題的原因以及服務生成器的任何參數是否可以解決原始問題。

回答

1

如果您能夠創建服務引用,那麼WSDL是有效的。異常消息是說你有_return命名空間/類型歧義問題。生成的代碼可能在某些上下文中將其用作布爾值,並在另一個上下文中用作Service.Status類型。

我在調用服務方法之前沒有調用ClientBase.Open方法,因爲我從來沒有見過它。我總是會根據情況調用Close &中止方法。 Open方法基本上只是將客戶端的狀態更改爲不再可配置。我不知道如何在生成的類中觸發代碼,因爲它是一種繼承的方法。我會嘗試刪除該行,看看你是否得到相同的異常。否則,如果您還沒有這樣做,請在生成的代碼中搜索_return所用的所有位置,並查看是否可以手動分類出合適的類型。每個上下文可能需要不同的名稱。

解決WSDL故障的另一種方法是創建Web引用(假設它是基於HTTP的服務)並查看生成的代碼是否按預期工作。如果它確實起作用,那麼使用ASMX客戶端,除非您需要WCF代理功能。