2010-07-19 5 views
7

पर HTTP प्रमाणीकरण पैरामीटर को सही तरीके से भेज रहा है, मैं माइक्रोसॉफ्ट के HttpClient का उपयोग कर किसी तृतीय पक्ष रीस्टफुल सेवा के लिए अनुरोध कर रहा हूं। यह एक उदाहरण के अलावा निष्पक्ष रूप से काम करता है (और इसे लागू करना बहुत आसान है)।माइक्रोसॉफ्ट.एचटीपी.एचटीपी क्लाइंट, रीडायरेक्ट

"जिस तरह से समूह संसाधन काम करता है के लिए पोस्ट कि इसके पूर्ण होने पर, यह समूह उदाहरण के लिए एक HTTP 302 रीडायरेक्ट करता है: यहाँ क्या त्रुटि दौरान उत्पन्न हो रही है के रूप में प्रदाता से एक टूटने है संसाधन। ऐसा प्रतीत होता है कि आपका HTTP क्लाइंट POST को उचित प्रमाणीकरण जानकारी भेज रहा है, जो समूह संसाधन बनाता है, लेकिन जब यह HTTP 302 अनुरोध के लिए GET को संभालता है, तो यह सही प्रमाण-पत्र नहीं भेज रहा है और एक 401 प्रतिक्रिया प्राप्त हो रही है। क्या आप अपनी क्लाइंट लाइब्रेरी की जांच कर सकते हैं और यह सुनिश्चित कर सकते हैं कि यह HTTP ऑथ पैरामीटर को रीडायरेक्ट पर सही तरीके से भेज रहा हो? "

यहाँ मेरी पोस्ट कोड है:

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 कक्षा का उपयोग करके इस जीईटी रीडायरेक्ट को भेजने के लिए मैं प्रमाणीकरण पैरामीटर कैसे प्राप्त करूं?

+0

यह कुकीज़ हो सकती है जो वे शायद अपने सत्र के लिए उपयोग करते हैं जिन्हें आप नहीं भेज रहे हैं (उनसे पूछें)। प्रत्येक रीडायरेक्ट के बाद लॉगिन जानकारी का अनुरोध करने के लिए अजीब होगा (जब तक कि यह किसी भिन्न वेब ऐप या सर्वर को फिर से न हो)। –

+0

- जारोस्लाव, मैं कुकीज़ के बारे में उनके उत्तर पर इंतजार कर रहा हूं। जहां तक ​​उन्हें भेजना है, क्या आप उचित तरीके से अवगत हैं? मैंने इस लाइन को जोड़ने का प्रयास किया: http.TransportSettings.Cookies = new CookieContainer(); कोई किस्मत के साथ ... – Drew

+0

क्या आप डब्लूसीएफ आरईएसटी स्टार्टर किट से एचटीपी क्लाइंट का उपयोग कर रहे हैं? कौन सा फ्रेमवर्क? क्या HttpClient को स्वचालित रूप से रीडायरेक्ट का पालन करने के लिए नियंत्रित करने के लिए कोई गुण है? (HttpWebRequest.AllowAutoRedirect के समान)? –

उत्तर

1

मुझे एक ही समस्या थी और अंत में मैंने वेबब्रोसर नियंत्रण के साथ एक फॉर्म जोड़ा। form.Show() पर कॉल करने के दौरान मैं उसे एक यूआरएल पर नेविगेट करने के लिए कह सकता हूं, बटन और सभी क्लिक कर सकता हूं।

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

और माइक्रोसॉफ्ट एचटीएमएल वस्तु COM लाइब्रेरी यदि स्रोत कोड की जरूरत है जोड़ा जाना चाहिए।

संबंधित मुद्दे