我正在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核心的一部分。编辑:
上面的自动生成的代码中的对象
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"
是不实际的,它需要是一个更有用的解决方案。 最佳答案
生成的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/