4

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は、構築されていますが、DeviceIdnullです

4

2 に答える 2

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、コントローラーアクションが呼び出されているのに url として指定しているようですGrantAccessRequest

于 2013-03-11T13:44:58.650 に答える
1

さて、これは最初から問題があるように見えます:

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

で何もしていないrequestので、uri常に null になります。デバイス ID がサーバーに到達することをどのように期待していますか?

(これを修正する方法を正確に知るには WebAPI について十分に知らないことを認めますが、おそらく呼び出しのrequest どこかで使用したいと考えています...属性PostAsJsonAsyncが与えられた場合、そのデータを[FromUri]使用する URI の一部です。)

于 2013-03-11T13:45:06.817 に答える