2013-08-19 28 views
7

Tôi đang cố gắng gửi chuỗi xml qua yêu cầu HTTP và nhận nó ở đầu bên kia. Trên đầu nhận, tôi luôn nhận được rằng xml là null. Bạn có thể cho tôi biết tại sao không?Làm thế nào để gửi xml thông qua một yêu cầu HTTP, và nhận được nó bằng cách sử dụng ASP.NET MVC?

Gửi:

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

Nhận:

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

Trả lời

9

tôi đã có thể có được điều này làm việc như vậy:

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

Tuy nhiên, tôi vẫn tò mò tại sao lấy xml như một tham số không hoạt động.

+0

Có vẻ một chút xấu xí, nhưng làm việc cho tôi quá với MVC 4. – AFract

+0

Nhờ nó cũng làm việc cho tôi .. .Nếu bạn gửi bài nó như một dòng suối bạn phải đọc luồng đầu vào để nhận dữ liệu. Để nhận được "xml" có thể đeo được, bạn phải gửi chuỗi này bằng chuỗi truy vấn dưới dạng thông số bài đăng –

0

Tôi tin rằng điều này là do bạn đã chỉ định req.ContentType = "text/xml";.

Nếu tôi nhớ chính xác khi bạn xác định điều khiển của bạn bằng cách sử dụng "nguyên thủy" loại (string là một "nguyên thủy" loại đây)

public ActionResult Index(string xml){} 

MVC sẽ cố gắng tìm kiếm xml hoặc trong một chuỗi truy vấn hoặc trong dữ liệu biểu mẫu đã đăng (trường nhập html). Nhưng nếu bạn gửi một cái gì đó phức tạp hơn cho máy chủ MVC sẽ quấn nó trong một lớp cụ thể.

Ví dụ, khi bạn tải lên nhiều tập tin đến máy chủ, bạn có thể chấp nhận chúng như sau trong điều khiển của bạn

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

Vì vậy, tôi đoán là bạn phải chấp nhận text/xml dòng trong bộ điều khiển bằng cách sử dụng lớp đúng .

Cập nhật:

Dường như không có một lớp học như vậy bởi vì bạn chấp nhận một luồng dữ liệu (và nó không xuất phát từ yếu tố đầu vào). Bạn có thể viết mô hình của riêng bạn chất kết dính để chấp nhận tài liệu xml. Xem các cuộc thảo luận dưới đây.

Reading text/xml into a ASP.MVC Controller

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

Các vấn đề liên quan