22

Sto riscontrando alcuni problemi quando utilizzo la classe HttpClient per accedere a un'API Delicious. Ho il seguente codice:Come utilizzare le credenziali in HttpClient in C#?

try 
{ 
    const string uriSources = "https://api.del.icio.us/v1/tags/bundles/all?private={myKey}"; 
    using (var handler = new HttpClientHandler { Credentials = new 
          NetworkCredential("MyUSER", "MyPASS") }) 
    { 
     using (var client = new HttpClient(handler)) 
     { 
      var result = await client.GetStringAsync(uriSources); 
     } 
    } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message, "ERROR...", MessageBoxButton.OK); 
} 

Quando si esegue il codice di cui sopra sto ottenendo il seguente: codice di stato di risposta non indica il successo: 401 (non autorizzato).

Quindi, come posso ottenere questo lavoro? È possibile?

Grazie in anticipo

Saluti!

+0

401 non autorizzato significa non corretto Nome utente o la password ... – Raptor

+0

lo so, però io sto usando quelli corretti ;-) – MikePR

+0

Quando ho messo sopra l'url in qualsiasi browser che mi chiede per il credencial (lo stesso che sto usando nel codice) e funziona. Quindi, suppongo che sia correlato al modo in cui httpClient richiede i dati – MikePR

risposta

0

Il codice che si sta visualizzando funziona per me rispetto a una risorsa autenticata. Sospetto che Delicious stia facendo qualcosa di strano.

Considerando che sei su Windows Phone, è un problema eseguire il debug con Fiddler, quindi quello che suggerisco è ottenere un account Runscope. Installa questo message handler che reindirizzerà la tua richiesta tramite il debugger di RunScope. Una volta fatto questo, ti suggerisco di guardare l'intestazione www-authenticate ed esaminare cosa sta restituendo.

Se tutto il resto fallisce, è sempre possibile impostare l'intestazione di autenticazione direttamente con le credenziali di autenticazione di base. Non è necessario utilizzare la classe Credenziali.

29

Ho avuto esattamente lo stesso problema. Sembra che lo HttpClient ignori semplicemente le credenziali impostate nello HttpClientHandler.

Quanto segue lavorare comunque:

using System.Net.Http.Headers; // For AuthenticationHeaderValue 

const string uri = "https://example.com/path?params=1"; 
using (var client = new HttpClient()) { 
    var byteArray = Encoding.ASCII.GetBytes("MyUSER:MyPASS"); 
    var header = new AuthenticationHeaderValue(
       "Basic", Convert.ToBase64String(byteArray)); 
    client.DefaultRequestHeaders.Authorization = header; 

    var result = await client.GetStringAsync(uri); 
} 

Nessuna necessità per il gestore.

Fonte: http://www.snip2code.com/Snippet/13895/Simple-C---NET-4-5-HTTPClient-Request-Us

+3

Questa soluzione funziona bene poiché consente di impostare l'intestazione di autorizzazione sulla prima richiesta, evitando così la sfida/risposta 401. Nella mia esperienza con HttpClient e HttpClientHandler, tuttavia, l'impostazione di pre-autenticazione funziona in quanto l'intestazione Autorizza è impostata su ogni richiesta dopo il completamento della Sfida/Risposta 401. Questo articolo lo spiega bene: http://weblog.west-wind.com/posts/2010/Feb/18/NET-WebRequestPreAuthenticate-not-quite-what-it-sounds-like – Philippe

+2

@Adam Szabo [this] (https://gist.github.com/bryanbarnard/8102915) sembra la fonte originale – superjos

1

Questo è un vecchio post, ma pensato di aggiungere la mia risposta per qualcuno di fronte a simili di emissione e di navigazione risposte ...

ho affrontato problema simile. Nel mio caso, l'impostazione della proprietà Domain per NetworkCredentials ha funzionato. Puoi provare a impostare il Dominio.

+0

Molto buono nirav bhai – SPatel