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 は、自動バッチ リクエストを処理していることを認識しません。
それが役立つ場合は、テスト ソリューションをアップロードすることもできます。