gpt4 book ai didi

c# - 使用 ServiceStack + 自定义序列化替换遗留系统并创建新的服务器代码

转载 作者:太空狗 更新时间:2023-10-30 01:08:21 32 4
gpt4 key购买 nike

我们有一个遗留的服务器代码,我们想放弃并使用 ServiceStack 开发新的。现有客户端不是用 .Net 编写的。我们根本不打算在客户端使用 .Net。

客户端和服务器之间的数据正在使用 XML 和 JSON 进行交换 - 目前 JSON 仅用作响应的返回格式(仅用于某些可用的服务)。 XML 格式是在几年前创建服务器解决方案的第一个版本时定义的。我们不想改变它。

我们如何使用 ServiceStack 构建新的 RESTful web 服务,将数据序列化和反序列化为过去设计的格式(请注意,客户端不会用 C#/.Net 编写)。我们需要同时控制:序列化和反序列化。是否可以使用 DTO 并且仍然可以控制这些对象的序列化/反序列化方式?

最佳答案

通过请求/响应过滤器添加自定义逻辑

参见 Request and response filters查看如何在调用服务之前和之后添加自定义逻辑。最好通过 Request / Response FilterAttributes 添加这些过滤器因为它允许您仅标记需要应用这些过滤器的服务。

请求过滤器的问题是它发生在反序列化到请求 DTO 之后,添加自定义反序列化逻辑为时已晚。为了解决这个问题,您可以在您的 AppHost 中注册一个自定义请求绑定(bind)器:

base.RegisterRequestBinder<MyRequest>(httpReq => ... requestDto);

这使您可以访问 IHttpRequest 对象并让您自己添加自定义反序列化逻辑。另一种选择是告诉 ServiceStack 不要尝试反序列化请求本身,而是注入(inject) HttpRequest InputStream 以便您可以自己反序列化请求:

public class Hello : IRequiresRequestStream {
Stream RequestStream { get; set; }
}

这两个示例都在 ServiceStack 的 Serialization and De-Serialization 上进行了解释维基页面。

注册您自己的自定义媒体类型

另一种能够返回强类型 DTO 但更改某些请求的输出的选项可以通过添加新的自定义媒体类型来完成,如 Northwind VCard Custom media type example 中所述。 ,例如:

public static void Register(IAppHost appHost)
{
appHost.ContentTypeFilters.Register( "text/x-vcard", SerializeToStream, DeserializeFromStream);
}

...

public static void SerializeToStream(IRequestContext requestContext, object response, Stream stream)
{
var customerDetailsResponse = response as CustomerDetailsResponse;
using (var sw = new StreamWriter(stream))
{
if (customerDetailsResponse != null)
{
WriteCustomer(sw, customerDetailsResponse.Customer);
}
var customers = response as CustomersResponse;
if (customers != null)
{
customers.Customers.ForEach(x => WriteCustomer(sw, x));
}
}
}

如果您可以在不同的内容类型下安装自定义 XML 响应,这是一个不错的选择,例如application/v-xml 所以它不会与现有的 XML 格式/端点冲突。使用 HTTP 客户端上方的 ContentType 可以通过 ?format=v-xml 或使用 HTTP header 调用此自定义实现:Accept: application/v-xml

如果您想覆盖内置的 XML ContentType,您仍然可以,但如果它不是您必须支持的遗留格式之一,我建议回退到 SerializeStream 和 DeserializeStream 方法的原始 XmlSerializer 实现。

绕过 ServiceStack 并使用您自己的自定义 IHttpHandler 执行

另一种选择是完全绕过 ServiceStack,而是在您自己的自定义 IHttpRequest 处理程序中处理请求,方法是在 AppHost 的 ServiceStack 配置中注册它:

 SetConfig(new EndpointHostConfig { 
RawHttpHandlers = {
httpReq => return IsLegacyMatch(httpReq) ? new LegacyXmlHandler() : null
}
});

返回 non-null(即任何处理程序)绕过 ServiceStack。

关于c# - 使用 ServiceStack + 自定义序列化替换遗留系统并创建新的服务器代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9683707/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com