web-dev-qa-db-fra.com

Ajout d'un en-tête d'autorisation à une référence Web

J'essaie de faire des demandes au service Web d'un client (je ne connais pas la plate-forme sous-jacente chez le client). J'ai utilisé le WSDL du client dans Visual Studio 2010 à l'aide de "Ajouter une référence Web" et généré ma classe de proxy (appelée "ContactService"). 

Je dois maintenant ajouter un en-tête d'autorisation similaire à celui ci-dessous à ma demande de service.

Header=Authorization & Value=Basic 12345678901234567890

(la valeur "123456 ..." ci-dessus est juste un espace réservé)

ContactService service = new ContactService();

//not sure if this is the right way - it's not working
WebClient client = new WebClient();
client.Headers.Add("Authorization", "Basic 12345678901234567890");            
service.Credentials = client.Credentials;

int contactKey = null;
try
{                
   contactKey = service.CreateContact("ABC", emailAddress, firstName, lastName, null);
}

Quelle est la bonne manière d'ajouter l'en-tête d'autorisation à la demande de service?

Je vous remercie!

10
Mike

La réponse ci-dessus était sur la bonne voie, mais il fallait simplement que ce soit dans un endroit différent.

J'ai ajouté ceci à ma classe de proxy Web de référence générée par .Net:

protected override WebRequest GetWebRequest(Uri uri)
    {
        HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(uri);            
        req.Headers.Add(HttpRequestHeader.Authorization,
                "Basic " + "12345678901234567890");

        return req;
    }

Une classe de proxy de référence Web étend System.Web.Services.Protocols.SoapHttpClientProtocol. Cette classe contient un appel à System.Net.WebRequest.GetWebRequest (Uri uri). Une requête WebRequest nous permet de définir des en-têtes spécifiques sur la demande lorsque les méthodes de la classe proxy sont appelées. 

Merci de votre aide!

13
Mike

Il y a quelques changements à faire.

Tout d’abord, il existe une constante pratique HttpRequestHeader.Authorization.

Deuxièmement, s’attendent-ils à ce que l’en-tête soit codé en Base64 - ceci est normalement requis pour l’authentification de base.

WebClient.Headers.Add(HttpRequestHeader.Authorization, 
    "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("12345678901234567890")));
10
Fenton

J'écris ceci pour qui a ce problème maintenant. Comme dans les réponses précédentes, la hiérarchie d'héritage mentionnée monte jusqu'à la classe WebClientProtocol, cette classe ayant une propriété ICredentials, définissez simplement cette propriété par une instance NetworkCredential comme ci-dessous:

YourServis.Credentials = new NetworkCredential("UserName", "Password", "Domain");

Je pense que c'est la manière la plus simple sans changer Reference.cs ou ajouter des en-têtes.

0
Ali Faradjpour