C# Web API 2 POST请求返回null

C# Web API 2 POST请求返回null,c#,angularjs,asp.net-web-api2,C#,Angularjs,Asp.net Web Api2,问题是,当输入方法时,“session”是空的。如您所见,标头和JSON对象是正确的。你能告诉我我做错了什么吗 我的发帖请求带有角度: $scope.send = function () { var data = { "session": session }; var req = { method: 'POST', data: data, headers: {'Content-

问题是,当输入方法时,“session”是空的。如您所见,标头和JSON对象是正确的。你能告诉我我做错了什么吗

我的发帖请求带有角度:

        $scope.send = function () {
        var data = { "session": session };
        var req = {
            method: 'POST',
            data: data,
            headers: {'Content-Type': 'application/json'},
            url: '/api/myquiz/answers/'
        }

        $http(req).success(
            function () {
                quiz();
            });
    }
    [Route("answers")]
    [HttpPost]
    public IActionResult AnswerPost([FromBody] string session) {

       ...

    }
和C#代码:

        $scope.send = function () {
        var data = { "session": session };
        var req = {
            method: 'POST',
            data: data,
            headers: {'Content-Type': 'application/json'},
            url: '/api/myquiz/answers/'
        }

        $http(req).success(
            function () {
                quiz();
            });
    }
    [Route("answers")]
    [HttpPost]
    public IActionResult AnswerPost([FromBody] string session) {

       ...

    }
Chrome控制台:

        $scope.send = function () {
        var data = { "session": session };
        var req = {
            method: 'POST',
            data: data,
            headers: {'Content-Type': 'application/json'},
            url: '/api/myquiz/answers/'
        }

        $http(req).success(
            function () {
                quiz();
            });
    }
    [Route("answers")]
    [HttpPost]
    public IActionResult AnswerPost([FromBody] string session) {

       ...

    }
请求URL:http://localhost:39634/api/myquiz/answers/
请求头
显示临时标题
接受:application/json、text/plain、*/*
内容类型:application/json
来源:http://localhost:39634
推荐人:http://localhost:39634/Team/Index
用户代理:Mozilla/5.0(Windows NT 6.3;WOW64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/40.0.2214.93 Safari/537.36
请求有效载荷
{会议:“92DFB7E43224702A553C98C294B29CF”}
会话:“92DFB7E43224702A553C98C294B29CF”
根据Web API,尝试直接发送会话(原始json字符串),而不是将其放入字典(json对象)


您正在向WebApi发布对象:

var data = { "session": session };
这意味着您正在传递一个具有会话属性的对象。不过,您要告诉WebApi方法的是一个字符串:

public IActionResult AnswerPost([FromBody] string session)
不是一个物体。 我认为如果您将代码更改为:

$scope.send = function () {
        //var data = { "session": session };
        var req = {
            method: 'POST',
            data: session,
            headers: {'Content-Type': 'application/json'},
            url: '/api/myquiz/answers/'
        }

        $http(req).success(
            function () {
                quiz();
            });
    }
它应该会起作用。希望这有帮助。不过,如果将来要向函数传递更多参数,我会创建一个C#对象来传递给控制器。像这样:

public class AnswerPost
{
  public string Session {get; set;}
}
[Route("answers")]
    [HttpPost]
    public IActionResult AnswerPost([FromBody] AnswerPost answerpost) {
...
}
public class ParamClass
{
   public string session { get; set; } // Note: it's case.sensitive
}
然后将控制器方法更新为如下所示:

public class AnswerPost
{
  public string Session {get; set;}
}
[Route("answers")]
    [HttpPost]
    public IActionResult AnswerPost([FromBody] AnswerPost answerpost) {
...
}
public class ParamClass
{
   public string session { get; set; } // Note: it's case.sensitive
}

Web API操作需要与参数类型匹配的值才能反序列化主体

因此,如果Web API参数是值类型,如
字符串会话
,则必须发布单个值,例如
“我的字符串”
,而无需额外包装

如果您的Web API参数是一个复杂的参数,例如一个具有属性的类,那么您必须发布一个JSON对象,就像您在问题中所做的那样

也就是说,您的参数应该是这样一个类的对象:

public class AnswerPost
{
  public string Session {get; set;}
}
[Route("answers")]
    [HttpPost]
    public IActionResult AnswerPost([FromBody] AnswerPost answerpost) {
...
}
public class ParamClass
{
   public string session { get; set; } // Note: it's case.sensitive
}

这有帮助吗?请尝试按以下方式定义数据
var data={'':session}
。您可以阅读更多“会话”变量来自哪里?thanx很多,这很有效!但如果只有一个参数,它就可以工作。按照这种方式,您可以尝试转换JSON对象:类似于
数据:“\'”+data+“\'”
。然后在WebAPI方法中得到[object object]。@shevchenko.ch Yes这只在您有一个参数时有效,因为您只能从表单体检索一个基本类型值。如果你能给它一个投票权,那就太好了。我会这样做,但没有足够的声誉(这个解决方案帮助了我。当你的api控制器接受一个字符串参数时,用
将确保它工作。但这仅适用于一个字符串参数的情况。非常感谢,如果您有多个参数,这是最好的解决方案。