2011-02-04 15 views
11

Tengo que consumir un servicio proporcionado por uno de nuestros socios. Me dieron poca dirección, pero me dijeron que la seguridad iba a ser 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.agregando encabezados http en llamada al servicio SoapHttpClient

Cuando comenzamos a probar hoy, inmediatamente me dijeron (por el mensaje de error) que las cosas no estaban bien. Resulta que nuestro socio no mira 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 en bruto, pero tengo un método específico de acceso que tiene algunos parámetros complejos para tratar (y además se siente como contraseñas).

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

Como referencia:

Proxy clase 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 { 

método de destino Necesito 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 pasan no son:

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

Gracias.

Respuesta

23

Se da cuenta de que 30 minutos después de la publicación tropezaría con la respuesta. Si bien la decapación de clase proxy no crea un método GetWebRequest, su clase base System.Web.Services.Protocols.SoapHttpClientProtocol lo tiene y se puede anular.

protected override System.Net.WebRequest GetWebRequest(Uri uri) 
{ 
    var request = base.GetWebRequest(uri); 
    request.Headers.Add("blah", "blah"); // <---- 
    return request; 
} 
+1

por favor no dude en marcar su propia respuesta – Snowbear

Cuestiones relacionadas