繁体   English   中英

ASP.NET Core MVC 2:服务器端的NameValueCollection实例为空

[英]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)

guidipdata将正确绑定到请求的值。

如果要更改此行为并将请求数据反序列化为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM