2014-04-10 34 views
2

我在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方法中。

編輯:

在上面自動生成上面代碼的對象thisSoapHttpClientProtocol一個子類,所以是我可以手工編寫用戶代理有自己:

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"是不實際的,它需要是一個更有用的解決方案。

+0

我可能會忽略一些但SoapHttpClientProtocol具有讀/寫UserAgent屬性:http://msdn.microsoft.com/en-US/library/system.web.services.protocols.httpwebclientprotocol.useragent.aspx –

+0

@SimonMourier抱歉,我沒有解釋顯然爲什麼我沒有那樣做。現在更新的問題 –

+0

當你實例化WebService生成的類時,爲什麼不能更改屬性,而不更改任何內容到生成的代碼?你也可以從課堂中派生出來。 –

回答

2

生成的Web服務引用類派生本身SoapHttpClientProtocol,這樣的事情:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.18408")] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Web.Services.WebServiceBindingAttribute(Name="MyGeneratedWebServiceSoap", Namespace="http://www.killroy.com/webservices/")] 
public partial class MyGeneratedWebService : System.Web.Services.Protocols.SoapHttpClientProtocol 
{ 
    ... 
} 

SoapHttpClientProtocol有一個讀/寫的UserAgent屬性,所以你可以做的是從這個類再派生並像這樣定製用戶代理(這種方式可以自動替換原來的類的所有實例創建):

public class SuperWs: MyGeneratedWebService 
{ 
    public SuperWs() 
    { 
     UserAgent = "Mozilla/5.0 (Killroy was here)"; 
    } 
} 
1

是自動生成的類的一部分類?

當它是一個局部類,那麼你應該創建自己的extention像「myWebservice_partial.cs」生成的類,命名類:

  • 公共部分類「GENERATEDCLASSNAME」 {}

    並定義/重寫構造函數。在這裏你可以設置你的UserAgent。這是更新。

此代碼未經測試,從我的大腦寫入。現在我不知道你是否必須從SoapHttpClientProtocol內部登入(見評論)

E.G.

FileName:WsClass_partial。CS

public partial class WsClass /* :SoapHttpClientProtocol */ { 
    public WsClass(string useragent):this(){ 
    this.UserAgent = useragent; 
    } 
} 
相關問題