SoapHttpClientProtocol

SoapHttpClientProtocol

我正在ASP.NET MVC4中调用第三方SOAP服务(Magento网络商店)。导入Web服务引用时,Visual Studio会自动实现所有服务方法,例如,登录肥皂方法被实现为

    public string login(string username, string apiKey) {
        object[] results = this.Invoke("login", new object[] {
                    username,
                    apiKey});
        return ((string)(results[0]));
    }


但是,当我调用此方法时,this.Invoke发送一个带有自动添加的用户代理标头的POST:

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;
            MS Web Services Client Protocol 4.0.30319.18444)


该标头告诉第三方,该用户代理是IE6。许多网站会自动阻止IE6,并显示“我们不支持IE6。请使用真正的浏览器,然后重试”。

因此,电话会议中断了,但这仅仅是因为第三方网站认为我们正在使用IE6,而不是因为电话会议有任何问题。如果我们可以更改此标头以模仿现代Web浏览器的UA字符串,则此问题将不存在。

那么,如何更改SoapHttpClientProtocol方法调用使用的UA字符串?所有这些都发生在this.Invoke方法内部,该方法是.NET核心的一部分。

编辑:

上面的自动生成的代码中的对象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"是不实际的,它需要是一个更有用的解决方案。

最佳答案

生成的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)";
    }
}

关于c# - 如何在SoapHttpClientProtocol中设置User-Agent header ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22977507/

10-11 03:11