Microsoft.Http.HttpClient, отправка параметров проверки подлинности HTTP правильно на перенаправлениях - PullRequest
7 голосов
/ 19 июля 2010

Я делаю запрос в стороннюю службу RESTful, используя Microsoft HttpClient. Он работает безупречно (и очень легко реализуемо), за исключением одного этого случая. Вот провал от поставщика относительно того, что происходит во время ошибки:

"Способ POST для ресурса group заключается в том, что по завершении он выполняет HTTP 302-перенаправление на ресурс экземпляра group . Похоже, что происходит ваш HTTP-клиент отправляет правильную информацию аутентификации в POST, который создает ресурс group , но когда он обрабатывает GET для запроса HTTP 302, он не отправляет правильные учетные данные и получает ответ 401 . Можете ли вы проверить свою клиентскую библиотеку и убедиться, что она правильно отправляет параметры HTTP-аутентификации при перенаправлениях? "

Вот мой POST-код:

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

Что подводит меня к моему вопросу; как получить параметры аутентификации для отправки по этому перенаправлению GET с использованием класса HttpClient?

1 Ответ

1 голос
/ 11 февраля 2011

У меня была похожая проблема, и в конце я добавил форму с элементом управления WebBrowser . Без звонка form.Show() я могу сказать ему, чтобы перейти к URL, нажимать кнопки и все. Вот класс, который контролирует эту форму:

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

А вот код формы (для отключения звука нажатия требуется дополнительный код).

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;
    }
}

И Microsoft Html Object COM-библиотека должна быть добавлена, если требуется исходный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...