7

我正在尝试通过 HTTP 请求发送一个 xml 字符串,并在另一端接收它。在接收端,我总是知道 xml 为空。你能告诉我这是为什么吗?

发送:

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

2 回答 2

10

我能够像这样工作:

[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 作为参数不起作用。

于 2013-08-19T19:15:33.140 回答
0

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

如果我没记错的话,当您使用“原始”类型定义控制器时(string这里是“原始”类型)

public ActionResult Index(string xml){}

MVC 将尝试xml在查询字符串或发布的表单数据(html 输入字段)中查找。但是,如果您向服务器发送更复杂的内容,MVC 会将其包装在特定的类中。

例如,当您将多个文件上传到服务器时,您可以在控制器中按如下方式接受它们

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

所以我的猜测是你必须text/xml使用正确的类来接受控制器中的流。

更新:

似乎没有这样的类,因为您接受数据流(并且它不是来自输入元素)。您可以编写自己的模型绑定器来接受 xml 文档。请参阅下面的讨论。

将 text/xml 读入 ASP.MVC 控制器

如何将 XML 作为 POST 传递给 ASP MVC .NET 中的 ActionResult

于 2013-08-19T19:36:00.143 回答