19

我必须使用我们的合作伙伴之一提供的服务。我没有得到什么指示,但被告知安全性是 PasswordDigest。我查了一下,立刻看到很多关于 WSE 的参考资料,所以我走了。它很容易实现,并且很快我就有了一个标准的 WSE 用户令牌,它使用 PasswordDigest 坐在我的消息的 SOAP 标头中。

当我们今天开始测试时,我立即被告知(通过错误消息)事情不正确。事实证明,out partner 不查看 SOAP 标头,而是希望 http 标头中的安全信息。

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

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

以供参考:

代理类声明:

[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 {

我需要调用的目标方法:

[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]));
    }
}

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

request.criteria = docCriteria;
request.document = document;
var result = service.uploadDocument(request);

谢谢。

4

1 回答 1

43

它认为在发布后 30 分钟我会偶然发现答案。虽然代理类声明不创建 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;
}
于 2011-02-04T19:21:19.557 回答