64

次のアクションを持つ MVC API コントローラーがあります。

メッセージの実際のデータ/本文の読み方がわかりませんか?

[HttpPost]
public void Confirmation(HttpRequestMessage request)
{
    var content = request.Content;
}
4

4 に答える 4

83

この回答から:

[HttpPost]
public void Confirmation(HttpRequestMessage request)
{
    var content = request.Content;
    string jsonContent = content.ReadAsStringAsync().Result;
}

注:コメントにあるように、このコードはデッドロックを引き起こす可能性があるため、使用しないでください。詳細については、このブログ投稿を参照してください。

于 2013-07-31T13:28:33.487 に答える
30
using System.IO;

string requestFromPost;
using( StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream) )
{
    reader.BaseStream.Position = 0;
    requestFromPost = reader.ReadToEnd();
}
于 2015-07-27T02:44:51.233 に答える
11

このようにしないことをお勧めします。アクション メソッドは、簡単に単体テストできるように設計する必要があります。この場合、リクエストから直接データにアクセスしないでください。このようにすると、このコードを単体テストするときにHttpRequestMessage.

MVC にすべてのモデル バインディングを行わせるには、次のようにする必要があります。

[HttpPost]
public void Confirmation(YOURDTO yourobj)//assume that you define YOURDTO elsewhere
{
        //your logic to process input parameters.

}

リクエストにアクセスしたい場合。コントローラーの Request プロパティにアクセスするだけです (パラメーターを介してではありません)。このような:

[HttpPost]
public void Confirmation()
{
    var content = Request.Content.ReadAsStringAsync().Result;
}

MVC では、Request プロパティは実際には .NET HttpRequest のラッパーであり、基本クラスから継承されます。単体テストが必要な場合は、このオブジェクトをモックすることもできます。

于 2013-07-31T13:43:40.447 に答える