1

次のような単純なサービスがあります。

[Route("/Message/{Folder}", "GET")]
public class MessageList : IReturn<List<Message>>
{
    public string Folder { get; set; }
}

public class MessageListService : Service
{
    private readonly IDatabase _database;
    public MessageListService(IDatabase database)
    {
        _database = database;
    }

    public List<Message> Get(MessageList request)
    {
        return _database.Fetch<Message>(
        "EXEC GetMessage @@Folder=@1", request.Folder);
     }

私はそれを次のように呼びます:

     http://localhost/Message/Inbox

どういうわけか、サービスは 2 回ヒットしました。最初は正しいリクエストで、次に request.Folder が未定義でした。奇妙なことに、2 回目の呼び出しでデータが返されなくても、フレームワークは常に最初の呼び出しから正しい結果を返します。そのため、たまたま SQL プロファイラーを実行するまで、これに気づきませんでした。

再試行の原因を正確に把握できませんでした。カミソリ UI を介して Inbox を呼び出すと、繰り返されないため、データに関連している可能性があると考えました。アーカイブを呼び出すと、そうです。しかし、データを返さない XYZ のようなランダムなパラメーターで呼び出すと、呼び出しも繰り返されます。

ただし、次のようにサービスを呼び出すと:

  http://localhost/Message/Inbox?format=json

次に、常に2回サービスをヒットします。1つは有効で、もう1つは入力パラメーターなしです。しかし、Json の結果は常に正しいようです。2 番目の無効な呼び出しがデータベースにヒットした後、消えました。

本当に助けが必要です。何が起こっているのか分かりますか?

4

1 に答える 1

2

ServiceStack はそれ自体を呼び出しません。サービスが 2 回呼び出されている場合は、クライアントが呼び出している可能性があります。Fiddler または WebInspector を使用して、実際に何が起こっているかを調べます。たとえば、Ajax クライアントを使用している場合、ブラウザは個別の OPTIONS リクエストを発行している可能性があります。この場合、すべての OPTIONS リクエストを Global Request filter で短絡できます。

于 2013-10-19T23:00:04.683 に答える