我是一名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"}
当我在Authentication控制器的Put处理程序中设置断点时:
public void Put(string IDstring, Authentication value)
{
}
我在观察窗口中看到以下内容:
IDstring null string
value {bbsRESTResources.Authentication} bbsRESTResources.Authentication
hashvalue null string
password null string
username null string
我的身份验证类如下所示:
namespace bbsRESTResources
{
public class Authentication
{
public string username;
public string password;
public string hashvalue;
}
}
我的路线看起来像这样:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
请不要关心这是否是处理身份验证的好方法。这只是从端到端测试我的应用程序的第一步。我找了其他人遇到这个问题的例子,却找不到。
答案 0 :(得分:6)
事实证明,模型绑定器仅适用于属性,而不适用于字段。因此,我需要从Authentication
类的各个成员中创建属性。当我将Authentication类的定义更改为以下内容时,它可以工作:
public class Authentication
{
public string hashvalue {get; set;}
public string password { get; set; }
public string username { get; set; }
}
答案 1 :(得分:2)
我有类似的问题(参数对象为null),原因不同。我将我的模型标记为Serializable,由于某些原因,当我这样做时,模型绑定不起作用。删除属性后,绑定再次起作用。
答案 2 :(得分:0)
将方法定义为
public void Put(Authentication value)
{
}