我一直在尝试将服务堆栈应用主机和客户端转换为使用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