如何通过HTTP请求发送xml,并使用ASP.NET MVC接收它
本文关键字:NET ASP MVC 请求 HTTP 何通过 xml | 更新日期: 2023-09-27 18:28:11
我正试图通过HTTP请求发送一个xml字符串,并在另一端接收它。在接收端,我总是得到xml为null。你能告诉我为什么吗?
发送:
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);
}
我能够像这样工作:
[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作为参数不起作用。
我相信这是因为您指定了req.ContentType = "text/xml";
。
如果我没记错的话,当你使用"基元"类型定义控制器时(这里string
是"基元类型")
public ActionResult Index(string xml){}
MVC将尝试在查询字符串或发布的表单数据(html输入字段)中查找xml
。但是,如果您将更复杂的东西发送到服务器,MVC将把它封装在一个特定的类中。
例如,当您将几个文件上传到服务器时,您可以在控制器中接受它们,如下所示
public ActionResult Index(IEnumerable<HttpPostedFileBase> files){}
因此,我的猜测是,您必须使用正确的类在控制器中接受text/xml
流。
更新:
似乎并没有这样的类,因为您接受了一个数据流(而且它不是来自输入元素)。您可以编写自己的模型绑定器来接受xml文档。请参阅下面的讨论。
将text/xml读入ASP.MVC控制器
如何在ASP MVC.NET 中将XML作为POST传递给ActionResult