我的 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
一片空白
最佳答案
摆脱[FromUri]
Controller Action 的属性。同样在客户端上,您似乎没有对 request
做任何事情。包含有效负载的变量:
public HttpResponseMessage PostGrantAccess(GrantAccessRequest grantAccessRequest)
为了更好地理解模型绑定(bind)在 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
在这种情况下请求 header ,因为您使用的是 PostAsJsonAsync
方法。另外我不知道这是否是您的问题中的错字,但您似乎已指定
api/accesspanel
作为 url,而您的 Controller 操作称为 GrantAccessRequest
.
关于.net - 在 web api 上接收时属性为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15340131/