adicionando cabeçalhos http na chamada ao serviço SoapHttpClient

Eu tenho que consumir um serviço prestado por um de nossos parceiros. Foi-me dada pouca orientação, mas me disseram que a segurança seria o PasswordDigest. Eu procurei e vi imediatamente muitas referências ao WSE, então fui embora. Foi muito fácil de implementar e, em pouco tempo, eu tinha um token de usuário WSE padrão usando o PasswordDigest nos cabeçalhos SOAP das minhas mensagens.

Quando começamos a testar hoje, fui informado imediatamente (pela mensagem de erro) que as coisas não estavam certas. Acontece que o parceiro não olha no cabeçalho SOAP, mas deseja as informações de segurança no cabeçalho http.

Eu já vi muitos artigos sobre como adicionar cabeçalhos http personalizados a uma classe de proxy, mas meu proxy herda de SoapHttpClientProtocol, que não tem uma coleção de cabeçalhos para adicionar. Eu estava pensando em criar um httpWebRequest bruto, mas tenho um método específico de acesso que possui alguns parâmetros complexos para lidar (e além disso, parece que é preciso voltar palavras-chave).

Qual é a melhor maneira de adicionar cabeçalhos HTTP personalizados a uma classe de proxy de serviço que não possui um método GetWebRequest?

Para referência:

Decleração de classe de proxy:

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

Método de destino que preciso chamar:

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

A chamada real para o serviço é simples. Os objetos que estão sendo transmitidos não são:

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

Obrigado.

questionAnswers(1)

yourAnswerToTheQuestion