Comment append un en-tête HTTP personnalisé pour le service Web client C # utilisant le service Web Axis 1.4

J’essaie d’écrire un client de service Web dans c # dont le service Web est Java Axis 1.4. Le service Axis requirejs la valeur d’en-tête Authorization: Basic Base64EncodedToken dans les en-têtes HTTP. Je ne trouve pas de moyen de définir cet en-tête dans les méthodes standard de consommation de services Web dans visual studio.net, comme la référence WSDL normale ou WSE3.0.

Je ne peux pas utiliser WCF car le projet est développé avec .net 2.0.

Est-ce qu’il y a un moyen de faire ça ?

Il semble que l’auteur original ait trouvé sa solution, mais pour quiconque cherche à append des en-têtes personnalisés, si vous avez access au mod, vous pouvez remplacer GetWebRequest :

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

Assurez-vous de supprimer l’atsortingbut DebuggerStepThroughAtsortingbute si vous souhaitez y accéder.

Parlons-nous de la WCF ici? J’avais des problèmes où les appels de service ne ajoutaient pas les en-têtes d’autorisation http, en encapsulant tous les appels dans cette déclaration, j’ai résolu mon problème.

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

Il s’agissait d’exécuter des appels SOAP vers IBM ESB via .NET avec authentification de base via http ou https.

J’espère que cela aide quelqu’un parce que j’ai beaucoup de problèmes à trouver une solution en ligne.

Si vous voulez envoyer un en-tête HTTP personnalisé (pas un en-tête SOAP), vous devez utiliser la classe HttpWebRequest à laquelle le code ressemblerait:

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

Vous ne pouvez pas append d’en-têtes HTTP à l’aide du proxy généré par Visual Studio, ce qui peut être très pénible.

Au lieu de modifier le code généré automatiquement ou d’encapsuler chaque appel dans un code en double, vous pouvez injecter vos en-têtes HTTP personnalisés en ajoutant un inspecteur de messages personnalisé, c’est plus facile qu’il n’y paraît:

 public class CustomMessageInspector : IClientMessageInspector { readonly ssortingng _authToken; public CustomMessageInspector(ssortingng 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 ssortingng _authToken; public CustomAuthenticationBehaviour (ssortingng 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)); } } 

Et lors de l’instanciation de votre classe client, vous pouvez simplement l’append en tant que comportement:

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

Cela fera que chaque appel de service sortant aura votre en-tête HTTP personnalisé.

Je trouve ce code et résout mon problème.

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", ssortingng.Format("Basic {0}", authValue)); return request; } 

La réponse de user334291 a été une bouée de sauvetage pour moi. Je veux juste append comment vous pouvez append ce que l’OP à l’origine avait l’intention de faire (ce que j’ai fini par utiliser):

Remplacement de la fonction GetWebRequest sur le code Webservice généré:

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

et définir les informations d’identification avant d’appeler le service Web:

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

Voici ce qui a fonctionné pour moi:

 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.ToBase64Ssortingng(credentialBuffer); request.Headers["Cookie"] = "BCSI-CS-2rtyueru7546356=1"; request.Headers["Cookie2"] = "$Version=1"; } else { throw new ApplicationException("No network credentials"); } return request; } 

N’oubliez pas de définir cette propriété:

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

Cookie et Cookie2 sont définis dans l’en-tête car le service Java n’acceptait pas la requête et je recevais une erreur non autorisée.