我正在尝试将现有的 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 包装在 MyInputModel
中以使序列化器满意。这实际上并不是向后兼容的选项。
我还可以将 SomeOtherObject
修改为顶级输入模型,并在其中放置一个 UserId
属性,但这也感觉不太理想,因为它是一个贯穿始终的对象api,并且实际上与用户 ID 无关。它也已经是独立出版的,因此在那里进行更改将是痛苦的。
有什么方法可以表明发布数据的根元素将是 SomeOtherObject
而非 MyInputModel
吗?在 WebApi 中,这将使用 [FromBody]
属性等。 servicestack 有类似的东西吗?
最佳答案
DTO 的目的是自动生成有线格式,这就是 ServiceStack 的原因。要求请求 DTO 与传入请求的形状相匹配。 ServiceStack 如此高效的部分原因在于它是一个代码优先的 Web 服务框架,鼓励从 C# 开始并向外转换,即您的客户端应该绑定(bind)到您的 Web 服务输出,而不是相反将代码优先模型映射到现有架构输入。
话虽如此,Serialization / Deserialization wiki page列出了用您自己的方法覆盖 ServiceStack 的默认请求绑定(bind)的不同方法。
访问任何服务或过滤器中的 HTTP 请求变量
并非所有内容都需要映射到 DTO,因为仍然可以从 IHttpRequest 访问任何 HTTP 变量可从任何服务或过滤器获取,即:
base.Request.QueryString
base.Request.FormData
base.Request.Headers[name]
base.Request.PathInfo
base.Request.AbsoluteUri
关于rest - 在 ServiceStack 中组合 URL 和 POST 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14987069/