我的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
为空
答案 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的一部分。)