ServiceStack.MsgPack + DateTimeOffset'Stream意外结束'

时间:2015-01-02 01:09:55

标签: c# servicestack msgpack

我一直在尝试将服务堆栈应用主机和客户端转换为使用MsgPack序列化。我一直得到例外

MsgPack.InvalidMessagePackStreamException Stream Unexpectedly Ends

经过一些调查后,我已将其追踪到响应对象中的DateTimeOffset字段。

客户代码

using System;

namespace Client
{
    using Server;

    using ServiceStack.MsgPack;

    class Program
    {
        static void Main(string[] args)
        {
            var client = new MsgPackServiceClient("http://localhost:1337");

            var response = client.Get(new GetRequest());

            Console.WriteLine("Response: [{0}] {1}", response.Timestamp, response.Result);

            Console.ReadKey();
        }
    }
}

服务器代码

using System;

namespace Server
{
    using System.Reflection;

    using ServiceStack;
    using ServiceStack.MsgPack;

    class Program
    {
        static void Main(string[] args)
        {
            var listeningOn = args.Length == 0 ? "http://localhost:1337/" : args[0];
            using (var appHost = new AppHost("Test", Assembly.GetAssembly(typeof(GetService))))
            {
                appHost.Init()
                    .Start(listeningOn);

                Console.WriteLine("AppHost Created at {0}, listening on {1}", DateTime.Now, listeningOn);

                Console.ReadKey();
            }
        }
    }

    public class AppHost : AppHostHttpListenerBase
    {
        public AppHost(string serviceName, params Assembly[] assembliesWithServices)
            : base(serviceName, assembliesWithServices)
        {
        }

        public override void Configure(Funq.Container container)
        {
            Plugins.Add(new MsgPackFormat());
        }
    }

    [Route("/GetRequest", Verbs = "GET")]
    public class GetRequest : IReturn<GetResponse> { }

    public class GetResponse
    {
        public string Result { get; set; }

        public string Timestamp { get; set; }
        //public DateTimeOffset Timestamp { get; set; }
    }

    public class GetService : Service
    {
        public GetResponse Get(GetRequest request)
        {
            return new GetResponse { Result = "Success", Timestamp = DateTimeOffset.UtcNow.ToString() };
            //return new GetResponse { Result = "Success", Timestamp = DateTimeOffset.UtcNow };
        }
    }
}

该示例在没有DateTimeOffset的情况下工作,但在包含它时出现异常。

MessagePackSerializer类似乎按预期工作,如以下测试所示。

public static void SerializeTest()
{
    var response = new GetResponse { Result = "Success", Timestamp = DateTime.UtcNow };
    var serializer = MessagePackSerializer.Get<GetResponse>();

    var asSingleObject = serializer.PackSingleObject(response);
    var fromSingleObject = serializer.UnpackSingleObject(asSingleObject);

    var packStream = new MemoryStream();
    serializer.Pack(packStream, response);

    packStream.Position = 0;
    var fromPackStream = serializer.Unpack(packStream);

    packStream.Position = 0; 
    serializer.PackTo(Packer.Create(packStream), response);

    packStream.Position = 0;
    var fromPacker = serializer.Unpack(packStream);
}

在每种情况下,响应都使用DateTimeOffset属性正确打包\解压缩。

我已经为DateTimeOffset尝试了自定义序列化程序,但失败的方式相同。

MsgPack.Cli 0.5.7 ServiceStack 4.0.35

0 个答案:

没有答案