【问题标题】:Property null when receiving on web api在 web api 上接收时属性为 null
【发布时间】:2013-02-26 17:17:56
【问题描述】:

我的 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 为空

【问题讨论】:

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


    【解决方案1】:

    去掉控制器动作上的[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 指定为 url,而您的控制器操作称为 GrantAccessRequest

    【讨论】:

      【解决方案2】:

      这看起来有问题:

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

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

      (我承认我对 WebAPI 知之甚少,无法确切知道您希望如何解决此问题,但大概您想在PostAsJsonAsync 调用中使用request somewhere。 .. 鉴于 [FromUri] 属性,我希望有东西可以将该数据转换为 URI 的一部分以供使用。)

      【讨论】:

        猜你喜欢
        • 2018-07-27
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 2020-11-06
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        • 2021-12-09
        相关资源
        最近更新 更多