在web api上接收时属性为null

时间:2013-03-11 13:42:01

标签: .net asp.net-mvc json web-services asp.net-web-api

我的web api中有以下方法

public class AccessPanelController : ApiController
    {
        public HttpResponseMessage PostGrantAccess([FromUri]GrantAccessRequest grantAccessRequest)
        {
            var deviceId = grantAccessRequest.DeviceId;

            var grantAccessResponse = new GrantAccessResponse()
                {
                    Status = "OK"
                };
            var response = Request.CreateResponse<GrantAccessResponse>(HttpStatusCode.OK, grantAccessResponse);
            return response;
        }

    }

GrantAccessRequest类:

public class GrantAccessRequest
{
    public string DeviceId { get; set; }
}

客户端:

  HttpClient client = new HttpClient();
            client.BaseAddress = new Uri("http://localhost:55208/");

            // Add an Accept header for JSON format.
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));

            Uri uri = null;

            var request = new GrantAccessRequest { DeviceId = "bla" };
            var response = client.PostAsJsonAsync("api/accesspanel", uri).Result;
            if (response.IsSuccessStatusCode)
            {
                uri = response.Headers.Location;
            }

在我的PostGrantAccess方法中,grantAccessRequest已构建,但DeviceId为空

2 个答案:

答案 0 :(得分:5)

删除控制器操作的[FromUri]属性。同样在客户端上,您似乎没有对包含有效负载的request变量执行任何操作:

public HttpResponseMessage PostGrantAccess(GrantAccessRequest grantAccessRequest)

为了更好地理解模型绑定在Web API中的工作原理,我建议您阅读following article

所以:

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://localhost:55208/");

    var request = new GrantAccessRequest { DeviceId = "bla" };
    var response = client.PostAsJsonAsync("api/accesspanel", request).Result;
    if (response.IsSuccessStatusCode)
    {
        var uri = response.Headers.Location;
    }
}

请注意,在这种情况下您不需要设置Accept请求标头,因为您使用的是PostAsJsonAsync方法。

此外,我不知道这是否是您问题中的拼写错误,但您似乎已将api/accesspanel指定为网址,而您的控制器操作则称为GrantAccessRequest

答案 1 :(得分:1)

从一开始就看起来有问题:

Uri uri = null;
var request = new GrantAccessRequest { DeviceId = "bla" };
var response = client.PostAsJsonAsync("api/accesspanel", uri).Result;

您永远不会对request做任何事情,uri将始终为空。您期望设备ID如何通过服务器?

(我承认我对WebAPI的了解不足以确切知道你应该如何解决这个问题,但可能你想在{{1}中使用request 某处调用...给定PostAsJsonAsync属性,我希望将某些内容转换为要使用的URI的一部分。)