[英]ASP.NET Core MVC 2: NameValueCollection instance is empty on the server side
这是客户端代码:
public class Class1
{
static void Main()
{
string data = "Some big string...";
Work(data);
Console.WriteLine("Press any key for exit...");
Console.ReadKey();
}
async static void Work(string data)
{
var guid = Guid.NewGuid();
Uri uri = new Uri("http://localhost:61698/Home/Task/" + guid.ToString());
using (Stream s = StringToStream(data))
{
var report = await PostStream(uri, guid, s);
}
}
public static Stream StringToStream(string s)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position = 0;
return stream;
}
async static Task<byte[]> PostStream(Uri uri, Guid guid, Stream stream)
{
try
{
using (StreamReader sr = new StreamReader(stream))
{
string text = await sr.ReadToEndAsync();
var host = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ip = null;
foreach (var item in host.AddressList)
{
if (item.AddressFamily == AddressFamily.InterNetwork)
{
ip = item;
}
}
var client = new WebClient();
var values = new NameValueCollection();
values.Add("Guid", guid.ToString());
values.Add("IP", ip.ToString());
values.Add("Data", text);
var bytes = await client.UploadValuesTaskAsync(uri, values);
return bytes;
}
}
catch(Exception err)
{
Console.Error.WriteLine(err.Message);
return null;
}
}
}
这是服务器端的控制器:
public class HomeController : Controller
{
[HttpGet]
public IActionResult Task(Guid id)
{
return Ok();
}
[HttpPost]
public IActionResult Task(NameValueCollection data)
{
if (ModelState.IsValid)
{
var count = data.Count; // 0
return Ok();
}
else
{
return BadRequest();
}
}
}
在调试模式下,我看到服务器端的NameValueCollection
为空。 为什么会发生?如何解决?
UploadValuesTaskAsync()
以表单编码格式发送请求:
内容类型:application / x-www-form-urlencoded
GUID = 660d9902-2293-43eb-906f-374adf77a9d6&IP = 192.168.100.3和数据=有些+大+串...
表单数据绑定到按名称匹配的操作参数。 因此,如果您的控制器具有以下签名:
[HttpPost]
public IActionResult Task(Guid guid, string ip, string data)
guid
, ip
和data
将正确绑定到请求的值。
如果要更改此行为并将请求数据反序列化为NameValueCollection
,则可以尝试使用FromBody
属性标记操作参数:
[HttpPost]
public IActionResult Task([FromBody] NameValueCollection data)
不幸的是,这将为您提供415 Unsupported Media Type response
。 发生这种情况是因为ASP.NET Core开箱即用仅支持JSON和XML媒体类型格式化程序。 您必须添加自定义媒体类型格式化程序才能使此工作。 快速搜索将这个项目带到了Github上。 我没有尝试过,但是至少您可以了解如何实现它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.