如何在MVC Action中获取发布的数据?

时间:2011-06-09 02:47:42

标签: c# asp.net-mvc controller

我正在尝试将一些数据发布到ASP.NET MVC Controller Action。目前我正在尝试使用WebClient.UploadData()将几个参数发布到我的操作中。

以下命令将执行操作,但所有参数均为null。如何从http请求中获取发布的数据?

string postFormat = "hwid={0}&label={1}&interchange={2}localization={3}";
var hwid = interchangeDocument.DocumentKey.Hwid;
var interchange = HttpUtility.UrlEncode(sw.ToString());
var label = ConfigurationManager.AppSettings["PreviewLabel"];
var localization = interchangeDocument.DocumentKey.Localization.ToString();

string postData = string.Format(postFormat, hwid, interchange, label, localization);

using(WebClient client = new WebClient())
{
   client.Encoding = Encoding.UTF8;
   client.Credentials = CredentialCache.DefaultNetworkCredentials;
   byte[] postArray = Encoding.ASCII.GetBytes(postData);
   client.Headers.Add("Content-Type", "pplication/x-www-form-urlencoded");
   byte[] reponseArray = client.UploadData("http://localhost:6355/SymptomTopics/BuildPreview",postArray);
   var result = Encoding.ASCII.GetString(reponseArray);
   return result;
}

这是我打电话的行动

  

公共ActionResult   BuildPreview(字符串hwid,字符串   标签,字符串交换,字符串   本地化){       ......}

当达到此Action时,所有参数都为null。

我尝试使用WebClient.UploadValue()并将数据作为NameValueCollection传递。这个方法总是返回500的状态,因为我从MVC应用程序中发出这个http请求,我找不到一种方法来愚弄它。

任何帮助解决这个问题都会非常有用。

-Nick

我更正了标题:

client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

现在,UploadData只是错误,服务器错误500。

4 个答案:

答案 0 :(得分:5)

只是为了笑,看看Request.Form和控制器中的RouteData,看看是否有东西结束了。

答案 1 :(得分:3)

我能够从Request对象的InputStream属性中获取post xml数据。

      public ActionResult BuildPreview(string hwid, string label, string localization)
         {
             StreamReader streamReader = new StreamReader(Request.InputStream);
             XmlDocument xmlDocument = new XmlDocument();
             xmlDocument.LoadXml(streamReader.ReadToEnd());
               ... 

 }

答案 2 :(得分:2)

作为一种权宜之计,您可以随时更改控制器操作以接受FormCollection参数,然后直接进入并按名称访问表单参数。

答案 3 :(得分:0)

WebClient.UploadData("http://somewhere/BuildPreview", bytes)

获取原始发布字节
public ActionResult BuildPreview()
{
    byte[] b;
    using (MemoryStream ms = new MemoryStream())
    {
        Request.InputStream.CopyTo(ms);
        b = ms.ToArray();
    }

    ...
}