2011-06-07 8 views
6

मैं एमवीसी नियंत्रक कार्रवाई में डेटा पोस्ट करने की कोशिश कर रहा हूं लेकिन अब तक असफल रहा है।मैं HttpWebRequest का उपयोग कर एमवीसी नियंत्रक को डेटा कैसे पोस्ट करूं?

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

HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(controllerUrl); 

     webRequest.Method = "POST"; 
     // webRequest.ContentType = "application/x-www-form-urlencoded"; 

     string postData = makeHttpPostString(interchangeFile); 
     byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
     webRequest.ContentLength = byteArray.Length; 

     using (Stream dataStream = webRequest.GetRequestStream()) 
     { 
      dataStream.Write(byteArray, 0, byteArray.Length); 
     } 

     HttpWebResponse webresponse = (HttpWebResponse) webRequest.GetResponse(); 

जब मैं अनुरोध के contenttype सेट करने के लिए "application/x-www-फार्म:

private string makeHttpPostString(XmlDocument interchangeFile) 
    { 
     string postDataString = "uid={0}&localization={1}&label={2}&interchangeDocument={3}"; 

     InterchangeDocument interchangeDocument = new InterchangeDocument(interchangeFile); 
     using (var stringWriter = new StringWriter()) 
     using (var xmlTextWriter = XmlWriter.Create(stringWriter)) 
     { 
      interchangeFile.WriteTo(xmlTextWriter); 
      string interchangeXml = HttpUtility.UrlEncode(stringWriter.GetStringBuilder().ToString()); 
      string hwid = interchangeDocument.DocumentKey.Hwid; 
      string localization = interchangeDocument.DocumentKey.Localization.ToString(); 
      string label = ConfigurationManager.AppSettings["PreviewLabel"]; 

      return (string.Format(postDataString, hwid, localization, label, interchangeXml)); 
     } 

    } 

यहाँ अनुरोध है urlencoded "GetReponse() सर्वर त्रुटि कोड 500 के साथ विफल रहता है मुझे लगता है कि बाहर टिप्पणी और केवल httpencode एक्सएमएल डेटा," interchangeXml ", पोस्ट भेज दिया जाता है, लेकिन केवल 3 पैरामीटर," लेबल "नियंत्रक तक पहुँचता है। अन्य शून्य हैं।

सही तरीका एक नियंत्रक कार्रवाई जब उन में से एक मान एक्सएमएल डेटा है के लिए मान पोस्ट करने के लिए क्या है?

धन्यवाद!

अद्यतन

मैं क्वेरी स्ट्रिंग के माध्यम से एक्सएमएल के अपवाद के साथ सभी पैरामीटर भेज रहा हूँ। हालांकि, अब समस्या यह है कि मुझे नहीं पता कि नियंत्रक कार्रवाई में पोस्ट किए गए डेटा को कैसे एक्सेस किया जाए। क्या कोई मुझे बता सकता है कि मैं अपने नियंत्रक एक्शन से HttpRequest से xml तक कैसे पहुंच सकता हूं?

अद्यतन

मैं डैरिन द्वारा मेरे लिए उपयोग करने के लिए किए गए पता चलता है ऊपर कोड पुनर्संशोधित है। मैं WebClient UploadValues ​​() का उपयोग कर एक आंतरिक सर्वर त्रुटि (500) प्राप्त कर रहा हूं।

कार्रवाई:

[AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult BuildPreview(PreviewViewModel model) 
     { 
      ... 
     } 

अनुरोध:

private string PostToSxController(XmlDocument interchangeFile, string controllerUrl) 
     { 
      var xmlInterchange = new InterchangeDocument(interchangeFile); 
      using (var client = new WebClient()) 
      { 
       var values = new NameValueCollection() 
           { 
            {"uid", xmlInterchange.DocumentKey.Hwid}, 
            {"localization", xmlInterchange.DocumentKey.Localization.ToString()}, 
            {"label", ConfigurationManager.AppSettings["PreviewLabel"]}, 
            {"interchangeDocument", interchangeFile.OuterXml } 
           }; 

       byte[] result = null; 

       try 
       { 
        result = client.UploadValues(controllerUrl, values); 
       } 
       catch(WebException ex) 
       { 
        var errorResponse = ex.Response; 
        var errorMessage = ex.Message; 
       } 

       Encoding encoding = Encoding.UTF8; 
       return encoding.GetString(result); 


      } 
     } 

रूट:

routes.MapRoute(
       "BuildPreview", 
       "SymptomTopics/BuildPreview/{model}", 
       new { controller = "SymptomTopics", action = "BuildPreview", model = UrlParameter.Optional } 
      ); 
+0

क्या डेटा संरचना अपने MVC कार्रवाई की उम्मीद कर रहा है? क्वेरी स्ट्रिंग के विपरीत, क्या आप xml में सभी डेटा पोस्ट नहीं कर सकते? – Jay

+0

नियंत्रक कार्रवाई 4 तारों की अपेक्षा कर रही है: interchangeXml, hwid, स्थानीयकरण, और लेबल। नहीं .. xml में अन्य मान नहीं हैं जो मैं पोस्ट करने का प्रयास कर रहा हूं। – Nick

+0

क्या आपने फिडलर या फ़ायरबग जैसे टूल का उपयोग करने का प्रयास किया है ताकि यह देखने के लिए कि आपका क्लाइंट सर्वर पर क्या भेज रहा है? यह सही ढंग से बाहर नहीं आ रहा है। – Tridus

उत्तर

12

उन सभी अनुरोधों और प्रतिक्रियाओं के साथ बहुत जटिल और असुरक्षित अपने ग्राहक कोड। आप अपने किसी भी अनुरोध पैरामीटर को एन्कोड नहीं कर रहे हैं, इस एक्सएमएल का उल्लेख न करें, अगर आप इसे ठीक से एन्कोड नहीं करते हैं तो शायद सब कुछ तोड़ने वाला है।

इस कारण से मैं आसान बनाने और एन्कोडिंग, आदि के बारे में पाइपलाइन कोड छोड़ना होगा के लिए ... नेट ढांचे के लिए:

using (var client = new WebClient()) 
{ 
    var values = new NameValueCollection 
    { 
     { "uid", hwid }, 
     { "localization", localization }, 
     { "label", label }, 
     { "interchangeDocument", interchangeFile.OuterXml }, 
    }; 
    var result = client.UploadValues(controllerUrl, values); 
    // TODO: do something with the results returned by the controller action 
} 

जहां तक ​​सर्वर साइड का संबंध है, हर ठीक से architected एएसपी के रूप में।

public class MyViewModel 
{ 
    public string Uid { get; set; } 
    public string Localization { get; set; } 
    public string Label { get; set; } 
    public string InterchangeDocument { get; set; } 
} 

साथ:

[HttpPost] 
public ActionResult Foo(MyViewModel model) 
{ 
    // TODO: do something with the values here 
    ... 
} 

जाहिर है यह आपके XML दस्तावेज़ की संरचना को दर्शाती एक दृश्य मॉडल लिख कर आगे एक कदम उठाया जा सकता है: नेट MVC आवेदन, यह स्पष्ट रूप से एक दृश्य के मॉडल का प्रयोग करेंगे

public class Foo 
{ 
    public string Bar { get; set; } 
    public string Baz { get; set; } 
} 

और फिर अपने दृश्य मॉडल बन जाएगा:

public class MyViewModel 
{ 
    public string Uid { get; set; } 
    public string Localization { get; set; } 
    public string Label { get; set; } 
    public Foo InterchangeDocument { get; set; } 
} 

और अंतिम भाग Foo प्रकार के लिए एक कस्टम मॉडल बाइंडर लिखना होगा जो उदाहरण में InterchangeDocument POSTed मान को deserialize करने के लिए एक XML serializer (या जो कुछ भी) का उपयोग करेगा। अब यह गंभीर व्यवसाय है।

+0

Google के माध्यम से समाधान के लिए धन्यवाद। मैं चीजों को सरल बनाने के लिए वेब क्लाइंट ऑब्जेक्ट का उपयोग करने का प्रयास करने जा रहा हूं। आपने कहा कि मैं एक्सएमएल एन्कोडिंग नहीं कर रहा था .. स्ट्रिंग इंटरचेंज एक्सएमएल = एचटीपीयूटीलिटी.उआरएलएनकोड (स्ट्रिंगवाइटर.गेटस्ट्रिंगबिल्डर()। टूस्ट्रिंग()); क्या यह एक्सएमएल एन्कोड करने का सही तरीका नहीं है? – Nick

+1

वेब क्लाइंट केवल कार्रवाई को मारने के बिना 500 प्राप्त करता है। मार्ग अब कैसे दिखाना चाहिए कि कार्रवाई एक दृश्य मॉडल की उम्मीद कर रहा है। मैंने आपके द्वारा सुझाए गए एक जैसा मॉडल बनाया है। – Nick

+0

@ निक, इस 500 त्रुटि का संदेश क्या है? –

1

मैं यहाँ पर एक ही जानवर कुश्ती हूँ: Trying to set up a controller action as Xml endpoint

आप क्योंकि या तो आप पर पेज मान्यता है आंतरिक सर्वर त्रुटि हो रही हो सकता है (समाधान: ValidateInput (गलत) के साथ addotate), या आप नहीं कर रहे हैं आपके अनुरोध के साथ एक स्वीकार्य-एन्कोडिंग हेडर भेजना। मुझे यह जानना बहुत अच्छा लगेगा कि मैं स्वीकार्य-एन्कोडिंग HTTP शीर्षलेख के बिना पोस्ट इनपुट स्वीकार करने के लिए एमवीसी कैसे प्राप्त कर सकता हूं ...

0

मुझे अभी पता चला है कि आप एक नियंत्रक को कॉल कर सकते हैं, यहां तक ​​कि एक निर्भरता इंजेक्शन भी एक वेब से "T4MVC" Nuget पैकेज का उपयोग पीछे प्रपत्र कोड:

https://github.com/T4MVC/T4MVC

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