2010-07-19 15 views
7

Sto effettuando una richiesta a un servizio RESTful di terza parte utilizzando Microsoft HttpClient. Funziona perfettamente (ed è molto facile da implementare) tranne per questa istanza. Ecco un'analisi dal provider di ciò che sta accadendo durante l'errore:Microsoft.Http.HttpClient, invio corretto dei parametri di autenticazione HTTP sui reindirizzamenti

"Il modo in cui il POST al gruppo funziona risorsa è che quando completa, fa un reindirizzamento HTTP 302 al gruppo esempio risorsa. Ciò che sembra accadere è che il client HTTP invia le informazioni di autenticazione corrette al POST, che crea la risorsa gruppo, ma quando gestisce GET per la richiesta HTTP 302, non invia le credenziali corrette e sta ottenendo una risposta 401. Puoi controllare la tua libreria client e assicurarti che invii correttamente i parametri di autorizzazione HTTP ai reindirizzamenti? "

Ecco il mio CAP:

HttpClient http = new HttpClient(BASE_URL); 
http.TransportSettings.Credentials = new NetworkCredential(ACCOUNT_SID, 
             ACCOUNT_TOKEN); 
HttpResponseMessage httpResponse = http.Post(groupUri, "application/xml", 
             HttpContent.Create(xml.ToString())); 
result = httpResponse.Content.ReadAsString(); 

che mi porta alla mia domanda; come posso ottenere i parametri di autenticazione da inviare su questo reindirizzamento GET utilizzando la classe HttpClient?

+0

Potrebbero essere i cookie che probabilmente usano per la loro sessione che non stai inviando (chiedi loro). Sarebbe strano richiedere le informazioni di accesso dopo ogni reindirizzamento (a meno che non venga redirato su una WebApp o un server diverso). –

+0

- Jaroslav, sto aspettando la loro risposta sui cookie. per quanto riguarda l'invio, sei a conoscenza del modo corretto? Ho provato ad aggiungere questa riga: http.TransportSettings.Cookies = new CookieContainer(); senza fortuna ... – Drew

+0

stai usando HttpClient dal kit di avviamento WCF REST? quale .net framework? HttpClient ha proprietà per controllare se seguire automaticamente i reindirizzamenti? (simile a HttpWebRequest.AllowAutoRedirect)? –

risposta

1

Ho avuto un problema simile e alla fine ho aggiunto un modulo con un controllo WebBrowser . Whithout chiamando form.Show() Posso dirgli di navigare verso un URL, fare clic sui pulsanti e tutto. Qui è la classe che controlla quella forma:

public class Nav 
{ 
    FormNav formNav = new FormNav(); 
    public string Source 
    { 
     get 
     { 
      mshtml.HTMLDocument doc = (mshtml.HTMLDocument)formNav.webBrowser.Document.DomDocument; 
      return doc.documentElement.innerHTML; 
     } 
    } 

    public void GoTo(string Url) 
    { 
     formNav.webBrowser.Navigate(Url); 
     Wait(); 
    } 

    public void Fill(string Field, string Value) 
    { 
     formNav.webBrowser.Document.GetElementById(Field).InnerText = Value; 
    } 

    public void Click(string Element) 
    { 
     formNav.webBrowser.Document.GetElementById(Element).InvokeMember("click"); 
     Wait(); 
     Application.DoEvents(); 
    } 

    public void Wait() 
    { 
     const int TIMEOUT = 30; 

     formNav.Ready = false; 
     DateTime start = DateTime.Now; 
     TimeSpan span; 

     do 
     { 
      Application.DoEvents(); 
      span = DateTime.Now.Subtract(start); 
     } while (!formNav.Ready && span.Seconds < TIMEOUT); 
    } 

    public void Dispose() 
    { 
     formNav.Dispose(); 
    } 
} 

Ed ecco il codice per il modulo (è necessaria un po 'di codice aggiuntivo per disattivare il suono di un click).

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

public partial class FormNav : Form 
{ 
    private const int FEATURE_DISABLE_NAVIGATION_SOUNDS = 21; 
    private const int SET_FEATURE_ON_THREAD = 0x00000001; 
    private const int SET_FEATURE_ON_PROCESS = 0x00000002; 
    private const int SET_FEATURE_IN_REGISTRY = 0x00000004; 
    private const int SET_FEATURE_ON_THREAD_LOCALMACHINE = 0x00000008; 
    private const int SET_FEATURE_ON_THREAD_INTRANET = 0x00000010; 
    private const int SET_FEATURE_ON_THREAD_TRUSTED = 0x00000020; 
    private const int SET_FEATURE_ON_THREAD_INTERNET = 0x00000040; 
    private const int SET_FEATURE_ON_THREAD_RESTRICTED = 0x00000080; 

    [DllImport("urlmon.dll")] 
    [PreserveSig] 
    [return: MarshalAs(UnmanagedType.Error)] 
    static extern int CoInternetSetFeatureEnabled(
     int FeactureEntry, 
     [MarshalAs(UnmanagedType.U4)] int dwFlags, 
     bool fEnable); 

    public bool Ready; 

    public FormNav() 
    { 
     InitializeComponent(); 
     Ready = true; 

     int feature = FEATURE_DISABLE_NAVIGATION_SOUNDS; 
     CoInternetSetFeatureEnabled(feature, SET_FEATURE_ON_PROCESS, true); 
    } 

    private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     Ready = true; 
    } 
} 

e l'oggetto libreria COM Microsoft HTML deve essere aggiunto se è necessario il codice sorgente.

Problemi correlati