gpt4 book ai didi

c# - 如何使用 HttpWebRequest 将数据发布到 MVC Controller ?

转载 作者:太空狗 更新时间:2023-10-29 21:02:50 24 4
gpt4 key购买 nike

我正在尝试将数据发布到 MVC Controller 操作,但到目前为止还没有成功。

这是帖子数据的结构:

private string makeHttpPostString(XmlDocument interchangeFile)
{
string postDataString = "uid={0}&localization={1}&label={2}&interchangeDocument={3}";

InterchangeDocument interchangeDocument = new InterchangeDocument(interchangeFile);
using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
interchangeFile.WriteTo(xmlTextWriter);
string interchangeXml = HttpUtility.UrlEncode(stringWriter.GetStringBuilder().ToString());
string hwid = interchangeDocument.DocumentKey.Hwid;
string localization = interchangeDocument.DocumentKey.Localization.ToString();
string label = ConfigurationManager.AppSettings["PreviewLabel"];

return (string.Format(postDataString, hwid, localization, label, interchangeXml));
}

}

请求如下:

 HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(controllerUrl);

webRequest.Method = "POST";
// webRequest.ContentType = "application/x-www-form-urlencoded";

string postData = makeHttpPostString(interchangeFile);
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
webRequest.ContentLength = byteArray.Length;

using (Stream dataStream = webRequest.GetRequestStream())
{
dataStream.Write(byteArray, 0, byteArray.Length);
}

HttpWebResponse webresponse = (HttpWebResponse) webRequest.GetResponse();

当我将请求的内容类型设置为“application/x-www-form-urlencoded”时,GetReponse() 失败,服务器错误代码为 500。 post 已发送,但只有第三个参数“label”到达 Controller 。其他为空。

当其中一个值是 xml 数据时,将值发布到 Controller 操作的正确方法是什么?

谢谢!

更新

我通过查询字符串发送除 XML 之外的所有参数。但是,现在的问题是我不知道如何在 Controller 操作中访问发布的数据。有人能告诉我如何使用 Controller 操作从 HttpRequest 访问 xml 吗?

更新

我重构了上面的代码以使用 Darin 给我的建议。我正在使用 WebClient UploadValues() 收到内部服务器错误 (500)。

行动:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult BuildPreview(PreviewViewModel model)
{
...
}

要求:

private string PostToSxController(XmlDocument interchangeFile, string controllerUrl)
{
var xmlInterchange = new InterchangeDocument(interchangeFile);
using (var client = new WebClient())
{
var values = new NameValueCollection()
{
{"uid", xmlInterchange.DocumentKey.Hwid},
{"localization", xmlInterchange.DocumentKey.Localization.ToString()},
{"label", ConfigurationManager.AppSettings["PreviewLabel"]},
{"interchangeDocument", interchangeFile.OuterXml }
};

byte[] result = null;

try
{
result = client.UploadValues(controllerUrl, values);
}
catch(WebException ex)
{
var errorResponse = ex.Response;
var errorMessage = ex.Message;
}

Encoding encoding = Encoding.UTF8;
return encoding.GetString(result);


}
}

路线:

routes.MapRoute(
"BuildPreview",
"SymptomTopics/BuildPreview/{model}",
new { controller = "SymptomTopics", action = "BuildPreview", model = UrlParameter.Optional }
);

最佳答案

包含所有这些请求和响应的客户端代码过于复杂且不安全。您没有对任何请求参数进行编码,更不用说这个 XML 如果您没有正确编码它可能会破坏一切。

出于这个原因,我会简化并将有关编码等的管道代码留给 .NET 框架:

using (var client = new WebClient())
{
var values = new NameValueCollection
{
{ "uid", hwid },
{ "localization", localization },
{ "label", label },
{ "interchangeDocument", interchangeFile.OuterXml },
};
var result = client.UploadValues(controllerUrl, values);
// TODO: do something with the results returned by the controller action
}

就服务器端而言,作为每个正确架构的 ASP.NET MVC 应用程序,它显然会使用 View 模型:

public class MyViewModel
{
public string Uid { get; set; }
public string Localization { get; set; }
public string Label { get; set; }
public string InterchangeDocument { get; set; }
}

与:

[HttpPost]
public ActionResult Foo(MyViewModel model)
{
// TODO: do something with the values here
...
}

显然,这可以通过编写反射(reflect) XML 文档结构的 View 模型更进一步:

public class Foo
{
public string Bar { get; set; }
public string Baz { get; set; }
}

然后你的 View 模型会变成:

public class MyViewModel
{
public string Uid { get; set; }
public string Localization { get; set; }
public string Label { get; set; }
public Foo InterchangeDocument { get; set; }
}

最后一部分是为 Foo 类型编写一个自定义模型绑定(bind)器,它将使用 XML 序列化程序(或其他)反序列化回 InterchangeDocument POSTed 值进入 Foo 实例。现在这是严肃的事情。

关于c# - 如何使用 HttpWebRequest 将数据发布到 MVC Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6270805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com