在调用SoapHttpClient服务时添加http标头

Ala*_*eke 16 service soaphttpclientprotocol

我必须使用我们的合作伙伴提供的服务.我得到了很少的指导,但被告知安全性是PasswordDigest.我查了一遍,立即看到了很多对WSE的引用,所以我离开了.它非常容易实现,并且我很快就使用了PasswordDigest的标准WSE用户令牌,该令牌位于我的消息的SOAP头中.

当我们今天开始测试时,我立刻被告知(通过错误消息)事情是不对的.事实证明,伙伴不会查看SOAP标头,而是希望http标头中的安全信息.

我已经看过很多关于如何将自定义http标头添加到代理类的文章,但是我的代理继承自SoapHttpClientProtocol,它没有要添加的标头集合.我正在考虑制作一个原始的httpWebRequest,但是我有一个特定的方法来访问它有一些复杂的参数来处理(而且它感觉就像回到正确的话).

将自定义http标头添加到没有GetWebRequest方法的服务代理类的最佳方法是什么?

以供参考:

代理类decleration:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.3053")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="MtomServiceSoap11", namespace="http://ws.xxxxxxx.com/")]
public partial class MtomServiceService : System.Web.Services.Protocols.SoapHttpClientProtocol {
Run Code Online (Sandbox Code Playgroud)

我需要调用的目标方法:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
[return: System.Xml.Serialization.XmlElementAttribute("uploadDocumentResponse", Namespace="http://ws.edsmtom.citizensfla.com/")]
public uploadDocumentResponse uploadDocument([System.Xml.Serialization.XmlElementAttribute(Namespace="http://ws.xxxxxxx.com/")] uploadDocumentRequest uploadDocumentRequest) {
    object[] results = this.Invoke("uploadDocument", new object[] {
        uploadDocumentRequest});
        return ((uploadDocumentResponse)(results[0]));
    }
}
Run Code Online (Sandbox Code Playgroud)

对服务的实际调用很简单.传入的对象不是:

request.criteria = docCriteria;
request.document = document;
var result = service.uploadDocument(request);
Run Code Online (Sandbox Code Playgroud)

谢谢.

Ala*_*eke 33

它表示发布后30分钟我会偶然发现答案.虽然代理类decelaration不会创建GetWebRequest方法,但其基类System.Web.Services.Protocols.SoapHttpClientProtocol具有它并且可以覆盖它.

protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
    var request = base.GetWebRequest(uri);
    request.Headers.Add("blah", "blah"); // <----
    return request;
}
Run Code Online (Sandbox Code Playgroud)

  • 请不要犹豫,标记自己的答案 (2认同)