服务器上无法识别自动批处理的请求

时间:2015-03-30 14:38:43

标签: c# request servicestack batching

我想试用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序列化请求到达服务器时,抛出异常:

  

类型定义应以&#39; {&#39;,期待序列化类型&#39; HelloRequestDTO&#39;开头,字符串开头为:[{&#34;名称&#34;:&#34 ;人物&#34;},{&#34;名称&#34;:&#34; PersonB&#34;},{&#34;名称&#34;:&#34; Pe的

我检查了请求是否有效,这是我用Fiddler捕获的内容:

  

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

     

接受:application / json

     

User-Agent:ServiceStack .NET Client 4,038

     

Accept-Encoding:gzip,deflate

     

Content-Type:application / json

     

主持人:MY-MACHINE:5667

     

内容长度:58

     

期待:100-continue

     

连接:Keep-Alive

     

[{&#34;名称&#34;:&#34;人物&#34;},{&#34;名称&#34;:&#34; PersonB&#34;},{&#34;名称& #34;:&#34; PersonC&#34;}]

当protobuf序列化请求到达时,只调用非数组处理程序(公共对象Any(HelloRequestDTO请求)),参数为&#34; PersonC&#34;,其他两个DTO被删除。

似乎我错过了某种切换,ServiceStack无法识别它正在处理自动批量请求。

如果有帮助,我也可以上传我的测试解决方案。

1 个答案:

答案 0 :(得分:0)

ServiceClient中的url应该只包含ServiceStack实例的BaseUrl,而不是特定服务的URL。

将网址更改为:

var baseUrl = "http://{0}/api/".Fmt(host);
var protoClient = new ProtoBufServiceClient(baseUrl);
var jsonClient = new JsonServiceClient(baseUrl);
相关问题