gpt4 book ai didi

c# - 如何在 SoapHttpClientProtocol 中设置 User-Agent header ?

转载 作者:行者123 更新时间:2023-11-30 22:07:28 39 4
gpt4 key购买 nike

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

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

但是当我调用这个方法时,this.Invoke 发送一个自动添加了这个用户代理 header 的 POST:

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

这个 header 告诉第 3 方用户代理是 IE6。许多网站会自动阻止 IE6,并显示一条消息,内容是“我们不支持 IE6。去换一个真正的浏览器,然后再试一次”

因此 soap 调用中断,但这只是因为第 3 方站点认为我们使用的是 IE6,而不是因为 soap 调用有任何问题。如果我们可以更改此 header 以模仿现代 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]));
}

但是,这是自动生成的代码,只要第 3 方更新他们的服务就会被覆盖(对于 Magento 来说,这很频繁),我必须手动将它添加到每个自动生成的函数中(很多)。所以这里只写this.UserAgent = "not IE6"是不实际的,它需要一个更有用的解决方案。

最佳答案

生成的 Web Service 引用类是从 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/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com