0

私が持っていた

[HttpPost]        
public ActionResult Foo()
{
    // read HTTP payload
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength));
 ....
}

ペイロードは application/json です。うまくいきました。それから私はに変更しました

public ActionResult Foo(string thing)
{
....
}

MyController/Foo?thing=yo Now I can't read the payload (長さは正しいが、ストリームは空です)に投稿する意図があります。私の推測では、コントローラーの配管が、メソッド パラメーターにマップできるフォーム ポスト データを探してペイロードを食べたということです。この動作を止める方法はありますか (確かに、MVC はタイプが JSON としてマークされているペイロードを食べるべきではありませんでした。フォームの投稿データのみを確認する必要があります)。私の回避策は、jsonに「もの」を追加することですが、それはあまり好きではありません

4

1 に答える 1

3

読む前に入力ストリームの位置をリセットしてみてください:

public ActionResult Foo(string thing)
{
    Request.InputStream.Position = 0;
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength));
    ....
}

ペイロードを送信している場合application/json、ビューモデルを単に定義して使用するのではなく、聖なる地球上でリクエストストリームを直接読み取る必要があるのはなぜですか。

public class MyViewModel
{
    public string Thing { get; set; }
    public string Foo { get; set; }
    public string Bar { get; set; }
    ...
}

その後:

public ActionResult Foo(MyViewModel model)
{
    // use the model here 
    ....
}

JsonValueProviderFactoryASP.NET MVC 3 には、 JSON 要求をモデルに自動的にバインドできるビルトインがあります。また、古いバージョンを使用している場合は、Phil Haack がブログ投稿で説明しているように、そのようなファクトリを自分で簡単に追加できます。

于 2012-05-25T06:20:14.437 に答える