Agregar encabezados http en la llamada al servicio SoapHttpClient

Tengo que consumir un servicio proporcionado por uno de nuestros socios. Me dieron poca dirección, pero me dijeron que la seguridad era PasswordDigest. Lo busqué e inmediatamente vi muchas referencias a WSE, así que me fui. Fue muy fácil de implementar y en poco tiempo tuve un token de usuario WSE estándar usando PasswordDigest en los encabezados SOAP de mis mensajes.

Cuando comenzamos a probar hoy, inmediatamente me dijeron (por el mensaje de error) que las cosas no estaban bien. Resulta que nuestro socio no busca en el encabezado SOAP, sino que quiere la información de seguridad en el encabezado http.

He visto muchos artículos sobre cómo agregar encabezados http personalizados a una clase de proxy, pero mi proxy hereda de SoapHttpClientProtocol que no tiene una colección de encabezados para agregar. Estaba buscando hacer una httpWebRequest sin procesar, pero tengo un método específico para acceder que tiene algunos parámetros complejos con los que lidiar (y además se siente como ir atrasados).

¿Cuál es la mejor manera de agregar encabezados http personalizados a una clase de proxy de servicio que no tiene un método GetWebRequest?

Para referencia:

Decleración de clase 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 al que debo llamar:

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

La llamada real al Servicio es simple. Los objetos que se pasan no son:

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

Gracias.

Respuestas a la pregunta(1)

Su respuesta a la pregunta