servicestack根目录和自定义xml序列化

时间:2014-03-07 02:38:27

标签: c# serialization servicestack

我目前在服务堆栈中有2个问题。我目前正在尝试构建一个模仿现有服务器软件的服务。这需要我遇到的一些问题。 这是使用自托管的servicestack实例和最新版本

  1. 我需要在“/”上提供不带参数的服务。
  2. 我的所有服务都需要使用客户XML序列化程序返回结果,而不是数据联系人,无论接受标头中是什么。 (目前返回DTO的html表示)
  3. 对于问题1,我一直在使用[FallbackRoute(“/”)],但无论我做什么,我都无法使用自定义序列化器。

    对于问题2,我使用dotnet xml序列化程序创建了一个自定义序列化程序,它将生成我需要的输出并将其注册为ContentTypeFilters。然后我手动设置响应类型标题,但这不会触发我的序列化程序。这真的开始让我疯狂,因为我需要实现大约20个服务,我甚至无法让简单的root服务工作,更不用说剩下的了。

    基本上我的XML采用DataContract序列化程序无法处理的格式,并且url和内容必须与现有系统完全匹配。

1 个答案:

答案 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"
    });
}

Fully working demo app

该演示是一个自托管控制台应用,它向根//Test发送请求,并返回自定义序列化响应。

希望这有帮助。