Come aggiungere intestazione Http personalizzata per il client di servizio Web C # che utilizza il servizio Web di Axis 1.4

Sto cercando di scrivere un client di servizi Web in c # che il webservice sia Java Axis 1.4. Il servizio Axis richiede l’ authorization: Base64EncodedToken , il valore dell’intestazione nelle intestazioni HTTP. Non riesco a trovare un modo per impostare questa intestazione in modalità standart di consumare servizi Web in visual studio.net, come la normale referenza generata da WSDL né con WSE3.0

Non posso usare WCF poiché il progetto è sviluppato usando .net 2.0.

C’è un modo per fare questo ?

Sembra che l’autore originale abbia trovato la loro soluzione, ma per chiunque altro che arriva qui cerca di aggiungere intestazioni personalizzate effettive, se si ha accesso a mod il codice del protocollo generato è ansible ignorare GetWebRequest :

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

Assicurati di rimuovere l’attributo DebuggerStepThroughAttribute se desideri intervenire.

Stiamo parlando di WCF qui? Ho riscontrato problemi in cui le chiamate di servizio non aggiungevano le intestazioni di authorization http, mentre l’inserimento di eventuali chiamate in questa istruzione ha risolto il 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); } 

Si trattava di effettuare chiamate SOAP a IBM ESB tramite .NET con autenticazione di base su http o https.

Spero che questo aiuti qualcuno perché ho avuto enormi problemi a trovare una soluzione online.

Se si desidera inviare un’intestazione HTTP personalizzata (non un’intestazione SOAP), è necessario utilizzare la class HttpWebRequest con la seguente formula:

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

Non è ansible aggiungere intestazioni HTTP usando il proxy generato dallo studio visivo, che può essere una vera sofferenza.

Anziché modificare il codice generato automaticamente o includere tutte le chiamate in codice duplicato, è ansible iniettare le intestazioni HTTP personalizzate aggiungendo un’intestazione del messaggio personalizzata, è più semplice di quanto possa sembrare:

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

E quando instanziate la vostra class cliente, potete semplicemente aggiungerla come un comportamento:

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

Questo farà sì che ogni chiamata di servizio in uscita abbia l’intestazione HTTP personalizzata.

Trovo questo codice e risolve il mio 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; } 

La risposta di user334291 è stata per me un salvavita. Voglio solo aggiungere come è ansible aggiungere ciò che l’OP intendeva originariamente fare (cosa ho finito per usare):

Sovrascrivere la funzione GetWebRequest sul codice del webservice generato:

 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; } 

e impostando le credenziali prima di chiamare il webservice:

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

Ecco cosa ha funzionato per me:

 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; } 

Non dimenticare di impostare questa proprietà:

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

Cookie e Cookie2 sono impostati nell’intestazione perché il servizio java non ha accettato la richiesta e ho ricevuto l’errore Non autorizzato.