2009-10-22 12 views
5

मैं (सी # का उपयोग करके) ASP.NET MVC में एक आवेदन का निर्माण कर रहा हूँ और मैं चाहूँगा में अनुरोध पर कार्रवाई करने cURL या इसी तरह का उपयोग पता है कि कैसे मैं अपने नियंत्रक अंदर कर्ल http://www.mywebsite.com/clients_list.xml की तरह कॉल प्रदर्शन कर सकते हैं असल में मैं ट्विटर एपीआई जैसे शो एडिट और डिलीट जैसे कार्यों को करने के लिए एक प्रकार का आरईएसटी एपीआई बनाना चाहता हूं।ASP.NET MVC - आवेदन

लेकिन दुर्भाग्य से अब तक मैं इस वेबसाइट पर खिड़कियों के लिए कि cURL के अलावा कुछ भी नहीं मिला: http://curl.haxx.se/

तो मैं नहीं जानता कि अगर वहाँ तरीकों के साथ URL से कॉल के इस प्रकार पुनः प्राप्त करने के किसी भी पारंपरिक तरीका है पोस्ट हटा देंगे और अनुरोध पर डाल दिया, आदि ...

की तरह मैं बस अपना ASP.NET MVC आवेदन पर मेरे नियंत्रक अंदर कर्ल की तरह आदेशों प्रदर्शन करने के लिए एक आसान तरीका जानना चाहूंगा।


अद्यतन:

हाय तो मैं, मैं ट्विटर से अद्यतन स्थिति एपीआई का उपयोग कर रहा हूँ प्राप्त अनुरोध करने में कामयाब रहे, लेकिन में पोस्ट उदाहरण के लिए अनुरोध को पुनः प्राप्त अब मैं एक गंभीर समस्या आ रही है कि कर्ल में इस तरह काम करेगा:

string responseText = String.Empty; 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://twitter.com/statuses/update.xml"); 
request.Method = "POST"; 
request.Credentials = new NetworkCredential("username", "password"); 
request.Headers.Add("status", "Tweeting from ASP.NET MVC C#"); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
{ 
    responseText = sr.ReadToEnd(); 
} 
return responseText; 
:

curl -u user:password -d "status=playing with cURL and the Twitter API" http://twitter.com/statuses/update.xml 

लेकिन मेरे ASP.NET MVC आवेदन पर मैं अपने कस्टम समारोह के अंदर इस तरह कर रहा हूँ \


अद्यतन:

मैं अंत में प्रबंधन

अब समस्या यह है कि इस अनुरोध को 403 लौटा रहा है निषिद्ध, मैं सच में पता नहीं क्यों अगर यह कर्ल

पर पूरी तरह से काम करता है यह काम कर रहा करने के लिए, लेकिन शायद वहाँ यह क्लीनर और सुंदर बनाने के लिए एक रास्ता है, के रूप में मैं सी # पर नया मैं यह करने के लिए और अधिक ज्ञान की आवश्यकता होगी हूँ, जिस तरह से पोस्ट पैरामीटर पारित कर रहे हैं मुझे बहुत उलझन में आता है क्योंकि का एक बहुत है कोड को पारित करने के लिए कोड।

ठीक है, मैं एक सार बना लिया है - http://gist.github.com/215900, इसलिए हर कोई के रूप में आप करेंगे इस पर संशोधन के लिए स्वतंत्र महसूस।

public string TwitterCurl() 
{ 
    //PREVENT RESPONSE 417 - EXPECTATION FAILED 
    System.Net.ServicePointManager.Expect100Continue = false; 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://twitter.com/statuses/update.xml"); 
    request.Method = "POST"; 
    request.Credentials = new NetworkCredential("twitterUsername", "twitterPassword"); 

    //DECLARE POST PARAMS 
    string headerVars = String.Format("status={0}", "Tweeting from ASP.NET MVC C#"); 
    request.ContentLength = headerVars.Length; 

    //SEND INFORMATION 
    using (StreamWriter streamWriter = new StreamWriter(request.GetRequestStream(), ASCIIEncoding.ASCII)) 
    { 
     streamWriter.Write(headerVars); 
     streamWriter.Close(); 
    } 

    //RETRIEVE RESPONSE 
    string responseText = String.Empty; 
    using (StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream())) 
    { 
     responseText = sr.ReadToEnd(); 
    } 

    return responseText; 

    /* 
    //I'M NOT SURE WHAT THIS IS FOR    
     request.Timeout = 500000; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.UserAgent = "Custom Twitter Agent"; 
     #if USE_PROXY 
      request.Proxy = new WebProxy("http://localhost:3000", false); 
     #endif 
    */ 
} 
+0

क्या वे उपयोगकर्ता नाम और पासवर्ड पैरामीटर्स को नेटवर्क प्रमाण-पत्र या सरल पोस्ट डेटा माना जाता है? मुझे ट्विटर एपीआई नहीं पता है, इसलिए यह बेहतर होगा कि आप समझें कि आप वास्तव में क्या करने की कोशिश कर रहे हैं। –

+0

बीटीडब्लू, ऐसा लगता है कि यदि आप पहुंचे तो आपको 403 वर्जित स्थिति मिल सकती है; 1. प्रति दिन सीमा के कुल 1,000 अपडेट। 2. प्रति दिन 250 कुल प्रत्यक्ष संदेश। 3. प्रति घंटे सीमा 150 एपीआई अनुरोध। http://help.twitter.com/forums/10711/entries/15364 –

+0

क्षमा करें, ठीक है, इस मामले में यह http://twitter.com/statuses/update.xml से मेरे ट्विटर खाते से कनेक्ट करने का प्रयास कर रहा है, इसलिए यदि आप अपने ब्राउज़र से इसे एक्सेस करने का प्रयास करते हैं तो आप देखेंगे कि यह उपयोगकर्ता नाम और पासवर्ड मांगता है, इसलिए इस मामले पर प्रमाण-पत्र मेरा ट्विटर खाता उपयोगकर्ता नाम और पासवर्ड होगा, जो मैं सोच रहा था कि curl -u उपयोगकर्ता नाम के समान होगा: पासवर्ड ... तो इस विधि में आवेदन मेरी ट्विटर खाते पोस्ट करने के लिए एक नया ट्वीट पैरामीटर "स्थिति" + क्रेडेंशियल्स भेजने और प्रतिक्रिया है कि चहचहाना इस मामले में एक xml फ़ाइल वापस भेज देंगे पुन: प्राप्त करने जोड़ेगी। – zanona

उत्तर

3

Microsoft.Http.HttpClient का उपयोग करें।यह आपके अनुरोध आप इस पुस्तकालय और उसके स्रोत WCF REST Starter kit Preview 2 में शामिल पा सकते हैं की तरह

var client = new HttpClient(); 
client.DefaultHeaders.Authorization = Credential.CreateBasic("username","password"); 

var form = new HttpUrlEncodedForm(); 
form.Add("status","Test tweet using Microsoft.Http.HttpClient"); 
var content = form.CreateHttpContent(); 

var resp = client.Post("http://www.twitter.com/statuses/update.xml", content); 
string result = resp.Content.ReadAsString(); 

लगेगा क्या, लेकिन यह वहाँ में सामान के बाकी की स्वतंत्र रूप से इस्तेमाल किया जा सकता है।

पीएस मैंने अपने ट्विटर खाते पर इस कोड का परीक्षण किया और यह काम करता है।

+0

हाय डेरेल यह है कि यह बहुत आसान लग रहा है के लिए धन्यवाद, लेकिन दुर्भाग्य से किसी भी गलती से मैं नहीं मिल सकता है कक्षाओं HttpClient और HttpUrlEncodedForm, मैं पहले से ही इस WCF पुस्तकालय स्थापित लेकिन मैं यह नहीं मिल सकता है, यहां तक ​​कि माइक्रोसॉफ्ट पुस्तकालय पर, वास्तव में नहीं माइक्रोसॉफ्ट theres यहां पर नामस्थान, मुझे यकीन है कि मैं कुछ गलत कर रहा हूं। क्षमा करें – zanona

+0

मेरी मशीन पर, डीएल यहाँ है सी: \ प्रोग्राम फ़ाइलें (x86) \ माइक्रोसॉफ्ट डब्ल्यूसीएफ आरईएसटी \ डब्ल्यूसीएफ आरईएसटी स्टार्टर किट पूर्वावलोकन 2 \ असेंबली। इसके अलावा, इंस्टॉलर में शामिल एक ज़िप फ़ाइल है जिसमें स्रोत कोड होता है। इसे खोलें और पूरा स्रोत वहां है। –

0

System.Net में देखो: Çağdaş

आपकी मदद के लिए धन्यवाद भी यहाँ कोड का पालन करें। WebClient कक्षा। यह आपको आवश्यक कार्यक्षमता प्रदान करना चाहिए। बेहतर अनाज नियंत्रण के लिए, आपको अधिक उपयोगी होने के लिए WebRequest मिल सकता है, लेकिन WebClient आपकी आवश्यकताओं के लिए सबसे अच्छा फिट लगता है।

2

उदाहरण HttpWebRequest और HttpWebResponse का उपयोग कर कोड:

public string GetResponseText(string url) { 
    string responseText = String.Empty; 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.Method = "GET"; 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    using (StreamReader sr = new StreamReader(response.GetResponseStream())) { 
     responseText = sr.ReadToEnd(); 
    } 
    return responseText; 
} 

डेटा पोस्ट करने के लिए:

public string GetResponseText(string url, string postData) { 
    string responseText = String.Empty; 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.Method = "POST"; 
    request.ContentLength = postData.Length; 
    using (StreamWriter sw = new StreamWriter(request.GetRequestStream())) { 
     sw.Write(postData); 
    } 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    using (StreamReader sr = new StreamReader(response.GetResponseStream())) { 
     responseText = sr.ReadToEnd(); 
    } 
    return responseText; 
} 
+0

धन्यवाद कि Çağdaş के लिए एक बहुत, अब मैं एक और समस्या आ रही है, मैं सवाल तो आप में जाँच कर सकते हैं यदि आप चाहें संपादित किया है। धन्यवाद फिर से – zanona

1

यह कोड की एक पंक्ति है जिसका उपयोग मैं एक विश्वसनीय API पर कॉल के लिए करता हूं जो JSON लौटाता है।

return ((dynamic) JsonConvert.DeserializeObject<ExpandoObject>(
     new WebClient().DownloadString(
      GetUri(surveyId)) 
    )).data; 

नोट्स

  • उरी surveyId और क्रेडेंशियल्स का उपयोग मंच से उत्पन्न होता है
  • 'डेटा' संपत्ति SurveyGizmo एपीआई द्वारा लौटे de-धारावाहिक JSON ऑब्जेक्ट का हिस्सा है

पूर्ण सेवा

public static class SurveyGizmoService 
{ 
    public static string UserName { get { return WebConfigurationManager.AppSettings["SurveyGizmo.UserName"]; } } 
    public static string Password { get { return WebConfigurationManager.AppSettings["SurveyGizmo.Password"]; } } 
    public static string ApiUri { get { return WebConfigurationManager.AppSettings["SurveyGizmo.ApiUri"]; } } 
    public static string SurveyId { get { return WebConfigurationManager.AppSettings["SurveyGizmo.Survey"]; } } 

    public static dynamic GetSurvey(string surveyId = null) 
    { 
     return ((dynamic) JsonConvert.DeserializeObject<ExpandoObject>(
       new WebClient().DownloadString(
        GetUri(surveyId)) 
      )).data; 
    } 

    private static Uri GetUri(string surveyId = null) 
    { 
     if (surveyId == null) surveyId = SurveyId; 
     return new UriBuilder(ApiUri) 
       { 
         Path = "/head/survey/" + surveyId, 
         Query = String.Format("user:pass={0}:{1}", UserName, Password) 
       }.Uri; 
    } 
}