2013-08-19 19 views
7

Próbuję wysłać ciąg xml za pośrednictwem żądania HTTP i odebrać go na drugim końcu. Na odbierającym końcu zawsze otrzymuję, że xml jest pusty. Czy możesz mi powiedzieć, dlaczego tak jest?Jak wysłać xml za pośrednictwem żądania HTTP i odebrać go za pomocą ASP.NET MVC?

Wyślij:

var url = "http://website.com"; 
    var postData = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><xml>...</xml>"; 
    byte[] bytes = System.Text.Encoding.ASCII.GetBytes(postData); 

    var req = (HttpWebRequest)WebRequest.Create(url); 

    req.ContentType = "text/xml"; 
    req.Method = "POST"; 
    req.ContentLength = bytes.Length; 

    using (Stream os = req.GetRequestStream()) 
    { 
     os.Write(bytes, 0, bytes.Length); 
    } 

    string response = ""; 

    using (System.Net.WebResponse resp = req.GetResponse()) 
    { 
     using (StreamReader sr = new StreamReader(resp.GetResponseStream())) 
     { 
      response = sr.ReadToEnd().Trim(); 
     } 
    } 

Pojemność:

[HttpPost] 
[ValidateInput(false)] 
public ActionResult Index(string xml) 
{ 
    //xml is always null 
    ... 
    return View(model); 
} 

Odpowiedz

9

udało mi się uzyskać to działa tak:

[HttpPost] 
[ValidateInput(false)] 
public ActionResult Index() 
{ 
    string xml = ""; 
    if(Request.InputStream != null){ 
     StreamReader stream = new StreamReader(Request.InputStream); 
     string x = stream.ReadToEnd(); 
     xml = HttpUtility.UrlDecode(x); 
    } 
    ... 
    return View(model); 
} 

Jednak wciąż jestem ciekaw dlaczego biorąc xml jako parametr nie działa.

+0

wydaje się nieco brzydki, ale pracował dla mnie zbyt z MVC 4. – AFract

+0

Thanks to również pracował dla mnie .. .Jeżeli Piszesz jako strumień trzeba czytać strumień wejściowy do pobierania danych. Aby odebrać w "xml" vairable, musisz wysłać to z łańcuchem zapytań jako parametrem post –

0

Uważam, że dzieje się tak, ponieważ podałeś req.ContentType = "text/xml";.

Jeśli dobrze pamiętam podczas definiowania kontrolera przy użyciu „prymitywne” typ (string bycie „prymitywny” Wpisz tutaj)

public ActionResult Index(string xml){} 

MVC będzie próbować szukać xml albo w ciągu kwerendy lub w przesłane dane formularzy (pole wprowadzania html). Ale jeśli wyślesz coś bardziej złożonego do serwera, MVC zawinie go w określonej klasie.

Na przykład, kiedy przesłać kilka plików na serwer można zaakceptować je następująco w kontrolerze

public ActionResult Index(IEnumerable<HttpPostedFileBase> files){} 

Więc domyślam się, że trzeba zaakceptować strumień w kontrolerze text/xml stosując właściwą klasę .

Aktualizacja:

Wydaje się, że nie jest tak dlatego, że klasa akceptuje strumienia danych (i nie przychodzi z elementu wejściowego). Możesz napisać własny segregator, aby zaakceptować dokument xml. Zobacz dyskusje poniżej.

Reading text/xml into a ASP.MVC Controller

How to pass XML as POST to an ActionResult in ASP MVC .NET

Powiązane problemy