2010-07-19 8 views
7

Estoy haciendo una solicitud a un servicio RESTful de un tercero usando HttpClient de Microsoft. Funciona sin problemas (y es muy fácil de implementar) excepto en esta instancia. Esta es una composición del proveedor en cuanto a lo que está ocurriendo durante el error:Microsoft.Http.HttpClient, enviando correctamente los parámetros de autenticación HTTP en los redireccionamientos

"La forma en que el POST al grupo funciona recurso es que cuando se finalice, se hace una redirección HTTP 302 al grupo instancia recurso. Lo que parece estar sucediendo es que su cliente HTTP está enviando la información de autenticación correcta al POST, que crea el recurso del grupo, pero cuando maneja el GET para la solicitud HTTP 302, no está enviando las credenciales correctas y está obteniendo una respuesta 401. ¿Puedes verificar tu biblioteca de cliente y asegurarte de que está enviando correctamente los parámetros de autenticación HTTP en los redireccionamientos? "

Aquí está mi código postal:

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

que me lleva a mi pregunta; ¿Cómo obtengo los parámetros de autenticación para enviar en esta redirección GET usando la clase HttpClient?

+0

Pueden ser las cookies que probablemente utilicen para su sesión que usted no envíe (pregunte). Sería extraño solicitar información de inicio de sesión después de cada redirección (a menos que se vuelva a redir a una aplicación web o servidor diferente). –

+0

- Jaroslav, estoy esperando su respuesta con respecto a las cookies. en cuanto a enviarlos, ¿conoces la forma correcta? intenté agregar esta línea: http.TransportSettings.Cookies = new CookieContainer(); sin suerte ... – Drew

+0

¿está utilizando el HttpClient del kit de inicio WCF REST? ¿Qué framework .net? ¿HttpClient tiene alguna propiedad para controlar si seguir automáticamente los redireccionamientos? (similar a HttpWebRequest.AllowAutoRedirect)? –

Respuesta

1

Tuve un problema similar y al final agregué un formulario con un control WebBrowser . Sin llamar al form.Show() puedo decirle que vaya a una URL, haga clic en botones y todo. Aquí está la clase que controla esa 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(); 
    } 
} 

Y aquí está el código para el formulario (es necesario algún código extra para desactivar el sonido de clic).

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; 
    } 
} 
la Microsoft HTML objeto COM Biblioteca debe añadirse si se necesita el código fuente

Y.

Cuestiones relacionadas