29 votes

Comment ajouter un en-tête Http personnalisé pour le client de service Web C # utilisant le service Web Axis 1.4

J'essaie d'écrire un client de service Web en c # dont le service Web est Java Axis 1.4. Le service Axis requiert 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 de manière standard pour consommer des services Web dans visual studio.net, comme la référence générée par WSDL normale ni avec WSE3.0

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

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

24voto

user334291 Points 141

Il semble que l'auteur d'origine ait trouvé sa solution, mais pour toute autre personne souhaitant ajouter des en-têtes personnalisés, si vous avez accès au mod du code de protocole généré, 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'attribut DebuggerStepThroughAttribute si vous souhaitez y accéder.

12voto

Simon RC Points 91

Parlons-nous de WCF ici? J'ai eu des problèmes où les appels de service n'ajoutaient pas les en-têtes d'autorisation http, l'encapsulage des appels dans cette déclaration a résolu mon problème.

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

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

j'espère que cela aide quelqu'un parce que j'ai eu d'énormes problèmes pour trouver une solution en ligne.

6voto

John Hunter Points 2204

Si vous souhaitez 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 ajouter d'en-têtes HTTP à l'aide du proxy généré par Visual Studio, ce qui peut être très difficile.

4voto

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

0voto

Chris W. Rea Points 3194

Voir Création d'applications ASP.NET sécurisées: authentification, autorisation et communication sécurisée et recherchez «Utilisation d'informations d'identification spécifiques». Consultez également les documents MSDN pour la classe CredentialCache .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X