2013-08-19 207 views
7

我想通過HTTP請求發送一個xml字符串,並在另一端接收它。在接收端,我總是得到這個XML爲空。你能告訴我爲什麼嗎?如何通過HTTP請求發送xml,並使用ASP.NET MVC接收它?

發送:

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

接收:

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

回答

9

我能得到這個工作,像這樣:

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

不過,我仍然好奇,爲什麼服用XML作爲一個參數不起作用。

+0

似乎有點醜,但對我來說與MVC工作太4. – AFract

+0

感謝,也爲我工作.. 。如果您是發佈它,你要讀一個流輸入流來獲取數據。要以「xml」可接受的方式接收,您必須將此查詢字符串作爲post參數發送 –

0

我相信這是因爲您指定了req.ContentType = "text/xml";

如果我沒記錯的話,當你確定使用「原始」型控制器(string是一個「原始」這裏型)

public ActionResult Index(string xml){} 

MVC將嘗試尋找xml無論是在查詢字符串或發佈的表單數據(html輸入字段)。但是,如果您向服務器發送更復雜的內容,MVC會將其包裝在特定的類中。

例如,當你上傳多個文件到服務器,你可以讓它們成爲你的控制器

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

如下所以我的猜測是,你必須使用正確的類接受控制器的text/xml流。

更新:

似乎沒有這樣的一類,因爲你接受一個數據流(和它不是從輸入元素來)。您可以編寫自己的模型綁定器來接受xml文檔。參見下面的討論。

Reading text/xml into a ASP.MVC Controller

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

相關問題