34

これは私を夢中にさせています。ASP.NET MVC を使用しています。別のサーバー (私の管理下にない) によって呼び出されるコールバック URL として機能する HttpPost アクションを備えたコントローラーがあります。WebAPI や Model Binding を使用せずに、投稿された JSON を動的に読み取りたい。URL には、クエリ文字列パラメーターも渡されます。

コールバック URL は次のようになります。

http://domain.com/callback?secret=1234

私は以下を使用して投稿された入力を読んでみました:

[HttpPost]
public ActionResult Callback( String secret )
{
    String jsonData = new StreamReader(this.Request.InputStream).ReadToEnd();

    // ...
}

ただし、「jsonData」は常に null または空です。

投稿された入力を取得して JsonFx に貼り付けて、コンテンツに動的にアクセスできるようにしたいだけです。これを最も簡単な方法で行う方法についてのアイデアはありますか?

アップデート

私は次のことを発見しました...

上記は機能しませんが (jsonData は null または空になります)、「秘密の」クエリ文字列パラメーターを省略するように呼び出し元のサーバーにある小さなオプションを構成すると、次のようになります。それは私のサーバーではないので、それで終わりです。この場合、jsonData には正しい投稿された JSON 文字列が含まれます。

[HttpPost]
public ActionResult Callback( /* String secret */ )
{
    String jsonData = new StreamReader(this.Request.InputStream).ReadToEnd();

    // ...
}

これは回避するのが非常にイライラすることであり、標準の MVC コントローラーでクエリ文字列と投稿された JSON データの両方を受け入れる簡単な方法がわかりません。

さまざまなサードパーティ サーバーからさまざまなデータ (GET、フォーム POST、JSON POST、クエリ文字列を使用した JSON POST など) を受け入れるアクション メソッドを備えた "コールバック コントローラー" があります。これらはマーチャント タイプのコールバックであり、情報の伝達に使用される形式や方法を私が制御することはできません。コールバックを受け入れて、そこにあるはずの情報を処理するだけです。

「JSON POST w/a Query String」の場合を除いて、すべてがコントローラーで正常に機能します。

これは、(少なくとも私には) 標準の ASP.NET MVC コントローラーの欠点のように見えます。???

標準の ASP.NET MVC コントローラーで使用できる、これに対する解決策を提案できる人はいますか?

4

3 に答える 3

61

ASP.NET MVC モデル バインディングが既にストリームを読み取っているという事実を考慮に入れると、最初のアプローチが機能するはずなので、巻き戻す必要があります。

[HttpPost]
public ActionResult Callback(string secret)
{
    Request.InputStream.Seek(0, SeekOrigin.Begin);
    string jsonData = new StreamReader(Request.InputStream).ReadToEnd();

    // ...
}
于 2013-07-25T12:34:18.053 に答える
2

ASP.NET Core 2 の場合、これでうまくいきます。

    [HttpPost]
    public ActionResult RawTest() {
        using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
        {  
            string content = reader.ReadToEndAsync().Result;
            //...
        }
        //...
    }
于 2018-08-21T11:27:02.270 に答える