c# web-services wsdl axis

Cómo agregar un encabezado Http personalizado para el servicio web C#Cliente que consume el servicio web Axis 1.4



web-services wsdl (7)

¿Estamos hablando de WCF aquí? Tuve problemas en los que las llamadas de servicio no agregaban los encabezados de autorizaciones HTTP, y el hecho de incluir cualquier llamada en esta declaración solucionó mi problema.

using (OperationContextScope scope = new OperationContextScope(RefundClient.InnerChannel)) { var httpRequestProperty = new HttpRequestMessageProperty(); httpRequestProperty.Headers[System.Net.HttpRequestHeader.Authorization] = "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(RefundClient.ClientCredentials.UserName.UserName + ":" + RefundClient.ClientCredentials.UserName.Password)); OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty; PaymentResponse = RefundClient.Payment(PaymentRequest); }

Esto estaba ejecutando llamadas SOAP a IBM ESB a través de .NET con autenticación básica sobre http o https.

Espero que esto ayude a alguien porque tuve grandes problemas para encontrar una solución en línea.

Intento escribir un cliente de servicio web en c #, cuyo servicio web es Java Axis 1.4. El servicio Axis requiere la Autorización: valor básico del encabezado Base64EncodedToken en los encabezados HTTP. No puedo encontrar una manera de configurar este encabezado en formas estándar de consumir servicios web en visual studio.net, como la referencia normal generada por WSDL ni con WSE3.0

No puedo usar WCF ya que el proyecto se desarrolla utilizando .net 2.0.

¿Hay alguna manera de hacer esto?


En lugar de modificar el código autogenerado o envolver cada llamada en código duplicado, puede inyectar sus encabezados HTTP personalizados agregando un inspector de mensajes personalizado, es más fácil de lo que parece:

public class CustomMessageInspector : IClientMessageInspector { readonly string _authToken; public CustomMessageInspector(string authToken) { _authToken = authToken; } public object BeforeSendRequest(ref Message request, IClientChannel channel) { var reqMsgProperty = new HttpRequestMessageProperty(); reqMsgProperty.Headers.Add("Auth-Token", _authToken); request.Properties[HttpRequestMessageProperty.Name] = reqMsgProperty; return null; } public void AfterReceiveReply(ref Message reply, object correlationState) { } } public class CustomAuthenticationBehaviour : IEndpointBehavior { readonly string _authToken; public CustomAuthenticationBehaviour (string authToken) { _authToken = authToken; } public void Validate(ServiceEndpoint endpoint) { } public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { } public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { clientRuntime.ClientMessageInspectors.Add(new CustomMessageInspector(_authToken)); } }

Y al crear una instancia de su clase de cliente, simplemente puede agregarlo como un comportamiento:

this.Endpoint.EndpointBehaviors.Add(new CustomAuthenticationBehaviour("Auth Token"));

Esto hará que cada llamada de servicio saliente tenga su encabezado HTTP personalizado.


Encuentro este código y resuelvo mi problema.

http://arcware.net/setting-http-header-authorization-for-web-services/

protected override WebRequest GetWebRequest(Uri uri) { // Assuming authValue is set from somewhere, such as the config file HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri); request.Headers.Add("Authorization", string.Format("Basic {0}", authValue)); return request; }


Esto es lo que funcionó para mí:

protected override System.Net.WebRequest GetWebRequest(Uri uri) { HttpWebRequest request; request = (HttpWebRequest)base.GetWebRequest(uri); NetworkCredential networkCredentials = Credentials.GetCredential(uri, "Basic"); if (networkCredentials != null) { byte[] credentialBuffer = new UTF8Encoding().GetBytes( networkCredentials.UserName + ":" + networkCredentials.Password); request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(credentialBuffer); request.Headers["Cookie"] = "BCSI-CS-2rtyueru7546356=1"; request.Headers["Cookie2"] = "$Version=1"; } else { throw new ApplicationException("No network credentials"); } return request; }

No te olvides de configurar esta propiedad:

service.Credentials = new NetworkCredential("username", "password");

Cookie y Cookie2 se configuran en el encabezado porque el servicio de Java no aceptaba la solicitud y recibí un error no autorizado.


La respuesta de user334291 fue un salvavidas para mí. Solo quiero agregar cómo puede agregar lo que el OP originalmente tenía la intención de hacer (lo que terminé usando):

Anulando la función GetWebRequest en el código de servicio web generado:

protected override System.Net.WebRequest GetWebRequest(Uri uri) { System.Net.WebRequest request = base.GetWebRequest(uri); string auth = "Basic " + Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(this.Credentials.GetCredential(uri, "Basic").UserName + ":" + this.Credentials.GetCredential(uri, "Basic").Password)); request.Headers.Add("Authorization", auth); return request; }

y establecer las credenciales antes de llamar al servicio web:

client.Credentials = new NetworkCredential(user, password);


Si desea enviar un Encabezado HTTP personalizado (no un Encabezado SOAP), entonces necesita usar la clase HttpWebRequest para que el código se vea así:

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.Headers.Add("Authorization", token);

No puede agregar encabezados HTTP utilizando el proxy generado por Visual Studio, que puede ser un verdadero problema.


Parece que el autor original ha encontrado su solución, pero para cualquier persona que llegue aquí buscando agregar encabezados personalizados reales, si tiene acceso a mod el código de protocolo generado puede anular GetWebRequest :

protected override System.Net.WebRequest GetWebRequest(Uri uri) { System.Net.WebRequest request = base.GetWebRequest(uri); request.Headers.Add("myheader", "myheader_value"); return request; }

Asegúrese de eliminar el atributo DebuggerStepThroughAttribute si desea entrar en él.