2

我正在尝试将现有的 wcf rest api 转换为 ServiceStack,并且一开始就遇到问题:

[Route("foo/{userId}","POST")]
public class MyInputModel : IReturnVoid
{
    public string userId { get; set; }
    public SomeOtherObject properties { get; set; }
}

这里的目的是我将在 url 中提供 userId,并在帖子正文中提供 SomeOtherObject 的实例。我得到的错误是

<Message>Could not deserialize 'application/xml' request using MyInputModel'
Error: System.Runtime.Serialization.SerializationException: 
Error in line 1 position 42. Expecting element 'MyInputModel' 
from namespace 'blahblahblah'.. Encountered 'Element'  with name 
'SomeOtherObject', namespace 'http://blahblahblah'. 

我唯一能想到的就是将我的 xml 包装在 aMyInputModel中以使序列化程序满意。这并不是向后兼容的真正选择。

我也可以修改SomeOtherObject为顶级输入模型,并在其中放置一个UserId属性,但这也感觉不是最理想的,因为它是整个 api 中使用的对象,并且实际上与用户 ID 无关。它也已经独立发布,因此在那里进行更改会很痛苦。

有什么方法可以表明发布数据的根元素将是 a 的SomeOtherObjectinstedMyInputModel吗?在 WebApi 中,这将是[FromBody]属性和诸如此类的东西。servicestack有类似的东西吗?

4

1 回答 1

4

DTO 的目的是自动生成有线格式,这就是为什么ServiceStack需要 Request DTO 来匹配传入请求的形状。ServiceStack 如此高效的部分原因在于它是一个代码优先的 Web 服务框架,它鼓励从C# 开始并向外投射,即您的客户端应该绑定到您的 Web 服务输出,而不是反过来将代码优先模型映射到现有的模式输入。

话虽如此,序列化/反序列化 wiki 页面列出了用您自己的方法覆盖 ServiceStack 的默认请求绑定的不同方法。

在任何服务或过滤器中访问 HTTP 请求变量

并非所有内容都需要映射到 DTO,因为仍然可以从任何服务或过滤器提供的IHttpRequest访问任何 HTTP 变量,即:

base.Request.QueryString
base.Request.FormData
base.Request.Headers[name]
base.Request.PathInfo
base.Request.AbsoluteUri
于 2013-02-20T19:23:16.990 回答