2010-07-19 6 views
7

yönergelerinde HTTP kimlik doğrulaması parametrelerini düzgün göndererek Microsoft'un HttpClient'u kullanarak üçüncü taraf bir RESTful hizmetine istekte bulunuyorum. Bu tek örnek dışında kusursuz çalışır (ve uygulanması çok kolaydır). kaynak işleri grubuna POST zaman tamamlar, bu grup örneğine bir HTTP 302 yönlendirmesi yapmasıdırMicrosoft.Http.HttpClient,

"yol: Burada hata sırasında oluşan ne gibi sağlayıcıdan bir arıza olduğunu Gerçekleşen, HTTP İstemcinizin doğru kimlik doğrulama bilgilerini POST'a göndermesidir. Bu, grubu kaynağını oluşturur, ancak HTTP 302 isteği için GET'i işlediğinde, doğru kimlik bilgilerini göndermez ve 401 yanıtı alıyor. İstemci kitaplığınızı kontrol edebilir ve yeniden göndermelerde HTTP auth parametrelerinin düzgün şekilde gönderilmesini sağlayabilir misiniz? " İşte

benim POST kodu: Sorumun getiriyor

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

; HttpClient sınıfını kullanarak bu GET yönlendirme üzerinde göndermek için kimlik doğrulama parametrelerini nasıl alabilirim?

+0

Muhtemelen oturumları için kullanmıyor olduğunuz çerezler olabilir (onlara sorun). Her yönlendirme sonrasında (farklı bir webApp veya sunucuya yönlendirilmedikçe) giriş bilgisi istemek garip olurdu. –

+0

- Jaroslav, çerezlerle ilgili cevaplarını bekliyorum. Onları göndermek için doğru yoldan haberdar mısınız? Bu satırı eklemeyi denedim: http.TransportSettings.Cookies = new CookieContainer(); Şanssız – Drew

+0

WCF REST başlangıç ​​kitinden HttpClient'i mi kullanıyorsunuz? hangi .net framework? HttpClient'in yönlendirmeleri otomatik olarak takip edip etmeyeceğini kontrol etmek için herhangi bir özelliği var mı? (HttpWebRequest.AllowAutoRedirect benzer)? –

cevap

1

Benzer bir sorunla karşılaştım ve sonunda bir WebBrowser denetimi ile bir form ekledim. form.Show() numaralı telefonu arayarak onun bir URL'ye, düğmelere ve hepsine gitmesini söyleyebilirim. İşte bu formu kontrol eden sınıftır:

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

Ve burada (bazı ekstra kod tıklama sesi devre dışı bırakmak için tabi) form için kodudur.

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

Ve kaynak kodu gerekiyorsa Microsoft Html Nesne COM Kütüphane eklenmelidir.