0

ServiceStack のAuto Batched Request機能を試してみたかったのです。しかし、サーバー側ではうまくいかないようです。私はこのようなサービスを持っています:

public class HelloService : Service
{
    public object Any(HelloRequestDTO request)
    {
        return new HelloResponseDTO { Greetings = "Hello, " + request.Name };
    }


    /// <summary>This method does not get invoked.</summary>
    public object Any(HelloRequestDTO[] requests)
    {
        return new HelloResponseDTO { Greetings = "Hello, " + string.Join(", ", requests.Select(r => r.Name).ToArray()) };
    }
}

これが DTO です。これらは共有ライブラリに配置されているため、クライアントとサーバーの両方で使用できます。

[ProtoContract]
public class HelloRequestDTO : IReturn<HelloResponseDTO>
{
    [ProtoMember(1)]
    public string Name { get; set; }
}

[ProtoContract]
public class HelloResponseDTO
{
    [ProtoMember(1)]
    public string Greetings { get; set; }
}

次のコードを使用して、コンソール アプリからリクエストを送信します。

var requests = new[]
                           {
                               new HelloRequestDTO { Name = "PersonA" },
                               new HelloRequestDTO { Name = "PersonB" },
                               new HelloRequestDTO { Name = "PersonC" }
                           };

        const string host = "MY-MACHINE:5667";
        var serviceUrl = string.Format("http://{0}/api/hello?", host);

        var protoClient = new ProtoBufServiceClient(serviceUrl);
        var jsonClient = new JsonServiceClient(serviceUrl);

        //var protoResponses = protoClient.SendAll(requests);
        var jsonResponses = jsonClient.SendAll(requests);

JSON のシリアル化された要求がサーバーに到着すると、例外がスローされます。

型定義は '{' で始まる必要があります。シリアル化された型 'HelloRequestDTO' が必要です。次で始まる文字列を取得しました: [{"Name":"PersonA"},{"Name":"PersonB"},{"Name":"Pe

リクエストが有効かどうかを確認しました。Fiddler でキャプチャしたものは次のとおりです。

POST http://MY-MACHINE:5667/api/hello?/json/reply/HelloRequestDTO[] HTTP/1.1

受け入れる: アプリケーション/json

ユーザーエージェント: ServiceStack .NET クライアント 4,038

Accept-Encoding: gzip,deflate

コンテンツ タイプ: アプリケーション/json

ホスト: MY-MACHINE:5667

コンテンツの長さ: 58

期待: 100-継続

接続: キープアライブ

[{"Name":"PersonA"},{"Name":"PersonB"},{"Name":"PersonC"}]

protobuf のシリアル化された要求が到着すると、配列以外のハンドラーのみが呼び出され (パブリック オブジェクト Any(HelloRequestDTO request))、パラメーターが "PersonC" の場合、他の 2 つの DTO は削除されます。

ある種のスイッチが欠落しているようです。ServiceStack は、自動バッチ リクエストを処理していることを認識しません。

それが役立つ場合は、テスト ソリューションをアップロードすることもできます。

4

1 に答える 1