我目前在服务堆栈中有2个问题。我目前正在尝试构建一个模仿现有服务器软件的服务。这需要我遇到的一些问题。 这是使用自托管的servicestack实例和最新版本
对于问题1,我一直在使用[FallbackRoute(“/”)],但无论我做什么,我都无法使用自定义序列化器。
对于问题2,我使用dotnet xml序列化程序创建了一个自定义序列化程序,它将生成我需要的输出并将其注册为ContentTypeFilters。然后我手动设置响应类型标题,但这不会触发我的序列化程序。这真的开始让我疯狂,因为我需要实现大约20个服务,我甚至无法让简单的root服务工作,更不用说剩下的了。
基本上我的XML采用DataContract序列化程序无法处理的格式,并且url和内容必须与现有系统完全匹配。
答案 0 :(得分:2)
看起来问题1和问题2都是同一个问题;您的自定义序列化程序未被调用。这是注册序列化程序,返回内容类型或两者的问题。下面显示了如何设置它。 使用ServiceStack v4:
在AppHost Configure
方法中,您需要注册自定义XML序列化程序:
StreamSerializerDelegate serialize = (request, response, stream) => {
// Replace with appropriate call to your serializer and write the output to stream
var myCustomSerializer = new MyCustomSerializer(response);
stream.write(myCustomerSerializer.getResult());
};
StreamDeserializerDelegate deserialize = (type, fromStream) => {
// Implement if you expect to receive responses using your type
throw new NotImplementedException();
};
// Register these methods to run if content type 'application/xml' is sent/received
ContentTypes.Register("application/xml", serialize, deserialize);
在您的服务中,您需要设置返回内容类型,以便序列化程序知道运行。您可以通过在每个方法上添加一个属性而不是使用此类型,或者如果所有方法都返回此类型,则可以将其配置为默认值。
您可以将AddHeader
属性与ContentType
参数一起使用。即:
public class TestService : Service
{
[AddHeader(ContentType = "application/xml")]
public TestResponse Get(RootRequest request)
{
return new TestResponse { Message = "Hello from root" };
}
}
您可以在AppHost Configure
方法中设置默认内容类型。即:
public override void Configure(Funq.Container container)
{
SetConfig(new HostConfig {
DebugMode = true,
DefaultContentType = "application/xml"
});
}
该演示是一个自托管控制台应用,它向根/
或/Test
发送请求,并返回自定义序列化响应。
希望这有帮助。