2011-06-07 23 views
6

MVC denetleyici eylemine veri göndermeye çalışıyorum ancak şu ana kadar başarısız oldum. Ben talep ContentType'ı setVerileri HttpWebRequest kullanarak MVC Denetleyicisine nasıl gönderirim?

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

için "uygulama/x-www-form-: Burada

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

    } 

istek: Burada

sonrası verilerin yapısı urlencoded "GetReponse(), sunucu hata kodu 500 ile başarısız olur. Bunu açıkladığımda ve sadece xen verilerini," interchangeXml "yi kodladığımızda, posta gönderilir ancak sadece 3. parametre," etiket "kontrolöre ulaşır. Diğerleri boş.

Bu değerlerden biri xml verileri olduğunda, bir denetleyici eylemine değerler göndermenin doğru yolu nedir?

Teşekkürler!

Güncelleme

sorgu dizesi yoluyla XML dışındaki tüm parametre göndermek duyuyorum. Ancak, sorun şu ki, denetleyici eyleminde yayınlanan verilere nasıl erişileceğini bilmiyorum. Birisi benim Denetleyici Eylemimle birlikte HttpRequest'ten xml'ye nasıl erişebileceğimi söyleyebilir mi?

Güncelleme

ben Darin tarafından bana yapılan önerir kullanmak yukarıdaki kodu refactored var. WebClient UploadValues ​​() kullanarak bir iç sunucu hatası (500) alıyorum.

Eylem:

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

İstek:

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


      } 
     } 

Rota: tüm bu istekleri ve yanıtlarıyla

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

veri yapısı sizin MVC eylem ne bekliyor? Sorgu dizgisinin tersine tüm verileri xml olarak gönderemez misiniz? – Jay

+0

Denetleyici eylemi 4 dizeleri bekliyor: interchangeXml, hwid, localisation ve label. Hayır .. xml göndermeye çalıştığım diğer değerleri içermiyor ve içermeyecek. – Nick

+0

İstemcinizin sunucuya tam olarak ne gönderdiğini görmek için Fiddler veya Firebug gibi bir araç kullanmayı denediniz mi? Doğru çıkmayabilir. – Tridus

cevap

12

Çok karmaşık ve güvensiz istemci kodu. İstek parametrelerinizi herhangi bir şekilde kodlamıyorsunuz, bu XML'den bahsetmiyorsunuz, muhtemelen doğru bir şekilde kodlamıyorsanız her şeyi kırıyorsunuz. .NET framework için ben basitleştirmek ve vb kodlama, yaklaşık sıhhi tesisat kodunu bırakacaktı Bu nedenle

...:
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 
} 

Bildiğim kadarıyla sunucu tarafında söz konusu olduğunda, her düzgün mimarisi ASP gibi.

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

ile: Açıkçası

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

bu XML belgesinin yapısını yansıtan bir görünüm modelini yazarak daha ileri bir adım atmış olabilir: NET MVC uygulaması, belli ki bir görünüm modelini kullanmak

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

ve sonra görünümü modeli haline gelecektir:

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

ve son bölüm Foo türünde bir Foo örneğine InterchangeDocument POSTed değerini geri serileştirmek için bir XML serileştiricisi (veya her neyse) kullanacak özel bir model ciltleyici yazmak olacaktır. Şimdi bu ciddi bir iş.

+0

Çözüm için teşekkür ederiz. Bazı şeyleri basitleştirmek için WebClient nesnesini kullanmayı deneyeceğim. Xml .. string interchangeXml = HttpUtility.UrlEncode (stringWriter.GetStringBuilder(). ToString()); Bu, xml'yi kodlamanın doğru yolu değil mi? – Nick

+1

WebClient, eylemi gerçekleştirmeden sadece 500 dolar alır. Rota, eylemin bir viewModel beklediğini şimdi nasıl görmelidir? Ben önerdiğin gibi bir viewModel yarattım. – Nick

+0

@Nick, bu 500 hatanın mesajı nedir? –

1

Buraya aynı canavar boğuştuğum: Trying to set up a controller action as Xml endpoint

üzerinde sayfa doğrulama var ya çünkü iç sunucu hatası alıyorum olabilir (çözelti: ValidateInput (yanlış) ile addotate), ya da değilsindir İsteğinizle bir Accept-Encoding başlığı göndererek. Kabul Edilebilir Kodlama HTTP başlığı olmadan gönderilen girdiyi kabul etmek için MVC'yi nasıl alabileceğimi duymak isterim ...

0

Bir denetleyiciyi, hatta Web'den bile bir bağımlılık enjekte edebildiğinizi fark ettim "T4MVC" Nuget paketini kullanarak arkasında formlar kodu:

https://github.com/T4MVC/T4MVC

İlgili konular