如何通过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);
}

如何通过HTTP请求发送xml,并使用ASP.NET MVC接收它

我能够像这样工作:

[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