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!
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!
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")));
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.