ASP.NET MVC - استخدام cURL أو ما شابه لتنفيذ الطلبات في التطبيق

StackOverflow https://stackoverflow.com/questions/1605814

سؤال

أقوم بإنشاء تطبيق في ASP.NET MVC (باستخدام C#) وأود أن أعرف كيف يمكنني إجراء مكالمات مثل curl http://www.mywebsite.com/clients_list.xml داخل وحدة التحكم الخاصة بي ، أود بناء نوع من API REST لأداء إجراءات مثل SHOM EDIT و DELETE ، مثل Twitter API.

لكن لسوء الحظ حتى الآن لم أجد أي شيء إلى جانب عنوان URL الخاص بالنوافذ على هذا الموقع: http://curl.haxx.se/

لذلك لا أعرف ما إذا كانت هناك أي طريقة تقليدية لاسترداد هذا النوع من الاستدعاءات من عنوان URL باستخدام طرق مثل حذف النشر وتقديم الطلبات، وما إلى ذلك...

أود فقط أن أعرف طريقة سهلة لتنفيذ أوامر مثل التجعيد داخل وحدة التحكم الخاصة بي على تطبيق ASP.NET MVC.


تحديث:

مرحبًا، لقد تمكنت من تقديم طلبات GET ولكن الآن أواجه مشكلة خطيرة في استرداد طلب POST على سبيل المثال، أنا أستخدم واجهة برمجة تطبيقات حالة التحديث من Twitter والتي ستعمل في حليقة على النحو التالي:

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

ولكن في تطبيق 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;

الآن المشكلة هي أن هذا الطلب يعود 403 محظورًا ، لا أعرف حقًا لماذا إذا كان يعمل بشكل مثالي على حليقة

:\


تحديث:

لقد تمكنت أخيرًا من تشغيله، ولكن ربما هناك طريقة لجعله أكثر نظافة وجمالًا، بما أنني جديد على لغة C#، سأحتاج إلى مزيد من المعرفة للقيام بذلك، والطريقة التي يتم بها تمرير معلمات POST تجعلني في حيرة من أمري لأنها الكثير من التعليمات البرمجية لتمرير المعلمات فقط.

حسنًا، لقد قمت بإنشاء Gist - http://Gist.github.com/215900 ، لذلك لا تتردد في مراجعته كما تريد.شكرا لمساعدتكم çağdaş

اتبع الكود هنا أيضًا:

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
    */
}
هل كانت مفيدة؟

المحلول

وحاول استخدام Microsoft.Http.HttpClient. هذا ما طلبك ستبدو

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

ويمكنك العثور على هذه المكتبة ومصدره تدرج في عدة WCF REST كاتب معاينة 2 ، ولكن يمكن أن تستخدم بشكل مستقل عن بقية الاشياء في هناك.

وP.S. أنا جربت هذا الرمز على حساب تويتر الخاص بي، وأنه يعمل.

نصائح أخرى

وكود مثال باستخدام HttpWebRequest و <ل أ href = "http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.aspx" يختلط = "نوفولو noreferrer"> 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;
}

هذا هو السطر الوحيد من التعليمات البرمجية الذي أستخدمه للاتصال بواجهة برمجة تطبيقات RESTful التي تُرجع JSON.

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

ملحوظات

  • يتم إنشاء Uri خارج المرحلة باستخدام معرف المسح وبيانات الاعتماد
  • خاصية "البيانات" هي جزء من كائن JSON غير المخلل الذي تم إرجاعه بواسطة API SurveyGizmo

الخدمة الكاملة

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