3

ApiController クラスを使用して、ASP.NET MVC4 で Web API に取り組んでいます。API には、署名検証に基づく認証チェックがあります。すべてのリクエストは、POST 本文といくつかの秘密鍵を使用して署名する必要があります。

また、JSON からオブジェクトへのモデル バインディングも使用したいと考えています。

そして今、私は問題を抱えています。JSON を送信でき、.net はそれをオブジェクトに適切にバインドしますが、検証を機能させることができません。

POST の Contenttype が application/json の場合、POST コンテンツ (送信された正確な形式) を取得するにはどうすればよいですか?

POST コンテンツ (アプリケーション/json):

{message: "blah"}

モデルクラス:

public class RequestModel
{
    public String Message { get; set; }
}

ApiController で JSON を取得するには?

4

4 に答える 4

2

を使用して、リクエスト本文を文字列として読み取ることができますrequest.Content.ReadAsStringAsync();。ただし、これはアクション メソッドまたはフィルターでは機能しません。

ASP.NET Web API パイプラインでは、アクション フィルターが実行される前にモデル バインディングが発生し、次にアクション メソッドが実行されます。モデル バインダーは、要求の本文 (1 回限りのストリーム) を読み取り、コンテンツを空にします。代わりに、モデル バインディングの前に実行されているコンポーネント (メッセージ ハンドラーなど) からコンテンツを読み取る場合は、要求本文 (この場合は JSON) を読み取ることができます。

public class MyHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
                                HttpRequestMessage request,
                                    CancellationToken cancellationToken)
    {
        var messageBody = await request.Content.ReadAsStringAsync();

        return await base.SendAsync(request, cancellationToken);
    }
}

ここでは、messageBody に JSON が含まれます。ハンドラーはパイプラインの早い段階で実行され、できるだけ早く認証を適用する必要があるため、ここでチェックを実装することをお勧めします。

于 2013-07-13T02:38:52.487 に答える
0

注意してください。json メッセージはモデルと正確に一致する必要があります。(メッセージではなくメッセージ プロパティ)

役職:

{Message: "blah"}

モデルクラス:

public class RequestModel
{
    public String Message { get; set; }
}

コントローラ:

[System.Web.Http.HttpPost]
public RequestModel PostUser(RequestModel model)
{
  //code
}
于 2013-07-12T18:24:40.133 に答える