3

ApiController で非同期メソッドを使用していますが、その動作に驚かされます。次のメソッドを呼び出します。

// GET api/values/{id}
public async Task<object> Get(int id)
{
    var received = DateTime.Now;
    await Task.Delay(10000);
    var finished = DateTime.Now;
    return new { id, received, finished };
}

4 つのブラウザー ウィンドウから、次の URL を順番に表示します。それぞれの間に約 1 秒の遅延があります。

http://localhost:55571/api/values/1
http://localhost:55571/api/values/2
http://localhost:55571/api/values/3
http://localhost:55571/api/values/2

最初の URL は予想どおり、起動してから 10 秒後に返され、その後すぐに 2 番目と 3 番目の URL が返されました。ただし、2 番目の URL と同じ 4 番目の URL は、2 番目の URL が返されてから 10 秒後に返されます。

これは、ブラウザーと私のコードの間の何かが、同じ URL、同じパラメーターのセット、または他の何かへの要求をシリアル化していることを示唆しています (POST、PUT などはどうですか?)。これをリバース エンジニアリングするのではなく、お聞きしたいのですが...

この動作はどこかに文書化されていますか?

編集:私はこのストローを握りしめようとしましたが、役に立ちませんでした.

編集:コメントで要求されているように、タイミングは(おおよそ)次のとおりです。

 0 s: GET …/values/1
 1 s: GET …/values/2
 2 s: GET …/values/3
 3 s: GET …/values/2 (2nd instance)
10 s: GOT …/values/1
11 s: GOT …/values/2
12 s: GOT …/values/3
21 s: GOT …/values/2 (2nd instance)
4

1 に答える 1

2

ブラウザは、ホストへの接続数を自発的に制限します。RFC 2616 (HTTP 1.1) は、永続的な接続を 2 つに制限することを推奨しています。お使いのブラウザは 3 つに制限されているようです。

于 2012-10-08T10:11:23.943 に答える