发布到asp.net核心mvc应用程序会导致null body和null输入参数

时间:2016-12-07 17:06:49

标签: c# json asp.net-core asp.net-core-mvc azure-service-fabric

这是我的第一个asp.net核心应用程序,所以我可能错过了一些明显的东西,但我已经查看了其他StackOverflow的答案,而那些解决方案对我没有帮助。我有一个asp.net核心mvc应用程序,我在服务结构上运行,我试图将字符串发布到控制器。该字符串最初是一个json对象数组。

我的ajax帖子:

var sendThis = { "operations": JSON.stringify(operations) };
$.ajax({
    url: '/Home/Execute',
    type: 'POST',
    data: sendThis,
    dataType: "json",
    contentType: 'application/json; charset=utf-8',
    error: function (xhr) {
        $("#save-footer-text").val("Saving failed. Please contact an administrator");
    },
    success: function (result) {
        $(".save-footer").addClass("slider");
    },
    async: true
});

我的控制器在另一边。我从另一个堆栈溢出答案中获取了流内容,但它只是在完成后返回一个空字符串。

[HttpPost]
public IActionResult Execute([FromBody] string operations /*this is null*/)
{
    var i = 5;
    string documentContents; //this will be an empty string.
    Request.Body.Position = 0;
    using (Stream receiveStream = Request.Body)
    {
        using (StreamReader readStream = new StreamReader(receiveStream, Encoding.Unicode))
        {
            documentContents = readStream.ReadToEnd();
        }
    }
    Console.WriteLine(i);
    return new OkResult();
}

从其他stackoverflow答案中,我也尝试使用传统设置发布为true,并且我已尝试将操作发布到模型中,例如

public class M
{
    public string status { get; set; }
    public string appName { get; set; }
    public string startTime { get; set; }
    public string endTime { get; set; }
    public string description { get; set; }
    public string operation { get; set; }
}

控制器已更改为公开IActionResult Execute([FromBody] List<M> operations)

我已检查过我的javascript确实发送了请求,Chrome工具报告请求有效负载为:

operations = 我的json字符串

我也在Fiddler看到了这一点,所以我知道它已经过去了。

根据this回答,我也尝试过更新JsonSettings,但这也没有帮助。

我使用1.0.0-rc2-final作为asp.net核心软件包,使用5.1.150作为服务结构。

我在这里缺少什么?对不起,如果答案真是微不足道。谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

这是M的清单?

如果是,那么你的json就不应该像这样

var sendThis = { "operations": JSON.stringify(operations) }; 

试试这个:

var sendThis = JSON.stringify(operations);

我认为asp.net正在尝试反序列化像这样的对象:

public class Operation
{
    public List<M> Operations { get; set; }
}

答案 1 :(得分:0)

如果脚本中的操作变量是数组

    var operations = new Array();

    var op1 = { status: 's1', appName: 'a1', startTime: 'st1', endTime: 'e1', description: 'd1', operation: 'o1' };
    operations.push(op1);

    var op2 = { status: 's2', appName: 'a2', startTime: 'st2', endTime: 'e2', description: 'd21', operation: 'o2' };
    operations.push(op2);

    var sendThis = JSON.stringify(operations);
    ...// ajax call here

控制器post方法定义如下,然后List<M> operations应包含按预期通过线路发送的值。

    [HttpPost]
    public IActionResult Execute([FromBody]List<M> operations)
    {
        // ... some code here
        return Json("");
    }