.Net 4 Web API在参数中接收NULL数据

Dan*_*Dan 5 c# asp.net-web-api

我是一个Web API新手在.Net 4中编写RESTFul Web Api服务.我为我正在调用的类配置了一个控制器Authentication.我遇到的问题是,当我将JSON数据发布或放入web api服务时,控制器中的处理程序被调用,但参数对象中包含NULL数据.我可以成功获取数据,但Post和Put会提供空参数对象.

我已经从客户端应用程序和Fiddler测试过,我得到了相同的结果.这是我从Fiddler发送的内容:

Action: PUT
URI: http://127.0.0.1:81/Authentication/xyz/
HTTP Version: HTTP/1.1
Request Headers:
User-Agent: Fiddler
Host: 127.0.0.1:81
Content-Type: application/json; charset=utf-8
Content-Length: 75
Request Body:
{"hashvalue":"kbVFNeBbNHmYQXXlS6d7Ag==","password":"test","username":"dan"}
Run Code Online (Sandbox Code Playgroud)

当我在身份验证控制器中的Put处理程序中设置断点时:

    public void Put(string IDstring, Authentication value)
    {

    }
Run Code Online (Sandbox Code Playgroud)

我在观察窗口中看到以下内容:

IDstring                    null    string
value   {bbsRESTResources.Authentication}   bbsRESTResources.Authentication
    hashvalue   null    string
    password    null    string
    username    null    string
Run Code Online (Sandbox Code Playgroud)

我的身份验证类如下所示:

namespace bbsRESTResources
{
    public class Authentication
    {
        public string username;
        public string password;
        public string hashvalue;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的路线看起来像这样:

        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
Run Code Online (Sandbox Code Playgroud)

请不要担心这是否是处理身份验证的好方法.这只是从端到端测试我的应用程序的第一步.我找了其他人遇到这个问题的例子,却没有找到.

Dan*_*Dan 6

事实证明,模型绑定器仅适用于属性,而不适用于字段.因此,我需要从Authentication班级的个别成员中制作属性.当我将Authentication类的定义更改为以下内容时,它可以工作:

public class Authentication
{
    public string hashvalue {get; set;}
    public string password { get; set; }
    public string username { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 此外,正如我对另一个可能导致同样问题的问题的一个关键点的说明.确保内容类型行为"Content-Type:application/json; charset = utf-8" (3认同)

Ali*_*tad 0

并将方法定义为

public void Put(Authentication value)
{

}
Run Code Online (Sandbox Code Playgroud)