我在ASP.NET MVC4中調用第三方SOAP服務(Magento網店)。當導入Web服務引用,所有的服務方法會自動由Visual Studio來實現,例如登錄皁方法實現爲如何在SoapHttpClientProtocol中設置User-Agent頭?
public string login(string username, string apiKey) {
object[] results = this.Invoke("login", new object[] {
username,
apiKey});
return ((string)(results[0]));
}
但是,當我把這種方法,this.Invoke
發送POST請求並提供此用戶代理header自動添加:
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;
MS Web Services Client Protocol 4.0.30319.18444)
此標頭告訴第三方用戶代理是IE6。和許多網站自動攔截IE6有消息說東西的效果「我們不支持IE6。我找一個真正的瀏覽器,然後再試一次」
所以SOAP調用中斷,但僅僅是因爲第三方網站認爲我們使用的是IE6,而不是因爲soap調用有任何問題。如果我們可以改變這個頭來模仿現代Web瀏覽器的UA字符串,那麼這個問題就不存在了。
那麼你怎麼改變SoapHttpClientProtocol方法調用使用的UA字符串呢?這一切都發生在.NET核心的一部分this.Invoke
方法中。
編輯:
在上面自動生成上面代碼的對象this
是SoapHttpClientProtocol
一個子類,所以是我可以手工編寫用戶代理有自己:
public string login(string username, string apiKey) {
this.UserAgent = "something, anything except for IE6";
object[] results = this.Invoke("login", new object[] {
username,
apiKey});
return ((string)(results[0]));
}
但是,這是自動生成的代碼,並且在第三方更新他們的服務時會被覆蓋(對於Magento,它是相當頻繁的),我必須手動將它添加到每個自動生成的函數(其中很多)。所以在這裏寫this.UserAgent = "not IE6"
是不實際的,它需要是一個更有用的解決方案。
我可能會忽略一些但SoapHttpClientProtocol具有讀/寫UserAgent屬性:http://msdn.microsoft.com/en-US/library/system.web.services.protocols.httpwebclientprotocol.useragent.aspx –
@SimonMourier抱歉,我沒有解釋顯然爲什麼我沒有那樣做。現在更新的問題 –
當你實例化WebService生成的類時,爲什麼不能更改屬性,而不更改任何內容到生成的代碼?你也可以從課堂中派生出來。 –