首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ServiceStack MsgPackServiceClient在获取数据时失败,但JsonServiceClient工作

ServiceStack MsgPackServiceClient在获取数据时失败,但JsonServiceClient工作
EN

Stack Overflow用户
提问于 2013-04-26 14:26:59
回答 1查看 447关注 0票数 4

我在玩ServiceStack,做一些初步的尝试来理解这项技术。

我有一个非常简单的设置(完整的解决方案是可供下载):

  • 使用AppHost独立使用ServiceStack (自托管)
  • 我启动服务器
  • 然后我查询Article数据的列表。

我为ServiceStack.Pluging.MsgPack安装了nuget包,添加了引用并正确设置了AppHost插件,如下面的main()代码所示。

DTO和Service类

这些是我使用的数据类、DTO类和服务类:

代码语言:javascript
运行
复制
public class Article : IReturn<Article>
{
    public string AR_REF { get; set; }
    public string AR_DESIGN { get; set; }
    public string AR_CODEBARRE { get; set; }
    public string FA_CODEFAMILLE { get; set; }
    public string CT_INTITULE { get; set; }
}

public class Articles : IReturn<List<Article>> { }

public class ArticleService : Service
{
    public List<Article> Get(Articles request) {
        return new List<Article>() { 
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,            
        };
    }
}

所有这些都是允许客户端获得一个16个虚拟Articles的列表。

服务器和客户端请求

代码语言:javascript
运行
复制
static void Main() {
    var appHost = new AppHost();
    appHost.Plugins.Add(new MsgPackFormat());
    appHost.Init();
    appHost.Start("http://localhost:8883");

    // Fails when calling client.Get()
    var client = new MsgPackServiceClient("http://localhost:8883");
    List<Article> response = client.Get(new Articles());

    appHost.Stop();
}

将AppHost定义为:

代码语言:javascript
运行
复制
public class AppHost : AppHostHttpListenerBase
{
    static readonly ConfigurationResourceManager AppSettings = new ConfigurationResourceManager();
    public AppHost() : base("Test", typeof(Article).Assembly) { }
    public override void Configure(Funq.Container container) {  }
}

会发生什么?

client.Get(...)的调用失败了,SerializationException说:

拆解员还没有读到任何数据。解包程序可能永远不会读取,或者底层流是空的。

  • 当我使用超过15条记录的MsgPackServiceClient()时,就会发生异常。 奇怪的是,如果我返回15个或更少的Articles实例,它就能工作。
  • 如果我使用JsvServiceClient()JsonServiceClient(),就可以返回数千条记录。

我真的不知道我是不是做错了什么,或者这里是不是有别的事情在起作用。

其他资讯及下载

我使用VS2012和ServiceStack 3.9.43 (包括MsgPack插件)通过nuget安装。

无论编译选项如何(AnyCPU/x86),都会出现问题。没有启用代码优化(默认的是每个解决方案/项目选项)。

您可以下载完整的解决方案并自己尝试它。

EN

回答 1

Stack Overflow用户

发布于 2013-04-30 17:16:16

所以,我不太清楚这是什么问题。它似乎是特定于在相同的MsgPackServiceClient应用程序中使用AppHost。如果您从浏览器向类似于http://localhost:8883/Articles?format=x-msgpack的东西发出请求,它似乎会工作。

编写测试(比如底部的测试)似乎可以确认MessagePackSerializer工作正常。

添加一个写入OutputStream的响应过滤器(下面)似乎可以纠正您的问题。我试过名单上有16张和32张唱片。

希望这能有所帮助。

代码语言:javascript
运行
复制
    appHost.ResponseFilters.Add((httpReq, httpRes, dto) =>
    {
        if (httpReq.ResponseContentType == ContentType.MsgPack)
        {
            using (var ms = new MemoryStream())
            {
                var serializer = MessagePackSerializer.Create(dto.GetType());
                serializer.PackTo(Packer.Create(ms), dto);

                var bytes = ms.ToArray();

                var listenerResponse = (HttpListenerResponse)httpRes.OriginalResponse;
                listenerResponse.OutputStream.Write(bytes, 0, bytes.Length);
                httpRes.EndServiceStackRequest();
            }
        }
    });

MessagePackSerializer试验

代码语言:javascript
运行
复制
    [Test]
    public void test()
    {
        var arts = new List<Article>() { 
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,
            new Article() {AR_CODEBARRE = "987654", AR_REF = "1002.ARRGHHH", AR_DESIGN = "BLAH BLAH TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "50FAM"} ,
            new Article() {AR_CODEBARRE = "123456", AR_REF = "515.VEROTEST", AR_DESIGN = "THIS IS A TEST", CT_INTITULE = "ACME", FA_CODEFAMILLE = "10FAM"} ,            
        };

        var serializer = MessagePackSerializer.Create<List<Article>>();

        var ms = new MemoryStream();
        serializer.PackTo(Packer.Create(ms), arts);
        ms.Position = 0;
        try
        {
            var obj = serializer.Unpack(ms);
            Assert.IsNotNull(obj);
        }
        catch (Exception ex)
        {
            throw ex;
        }

        ms.Close();
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16238889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档