【问题标题】:Combining URL and POST variables in ServiceStack在 ServiceStack 中组合 URL 和 POST 变量
【发布时间】:2013-02-20 18:16:35
【问题描述】:

我正在尝试将现有的 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 中使用的对象,并且实际上并没有绑定到用户身份。它也已经独立发布,因此在那里进行更改会很痛苦。

有没有办法表明发布数据的根元素将是 SomeOtherObject 插入 MyInputModel?在 WebApi 中,这将带有 [FromBody] 属性等等。 servicestack有类似的吗?

【问题讨论】:

    标签: rest routing servicestack


    【解决方案1】:

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

    话虽如此,Serialization / Deserialization wiki page 列出了用您自己的方法覆盖 ServiceStack 的默认请求绑定的不同方法。

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

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

    base.Request.QueryString
    base.Request.FormData
    base.Request.Headers[name]
    base.Request.PathInfo
    base.Request.AbsoluteUri
    

    【讨论】:

    • 这实际上很有意义。如果我从头开始设计这项服务,我肯定会做不同的事情,但是我的双手被现有的 api 束缚住了。在我的情况下,我可以只创建输入模型SomeOtherObject 并从路径中读取 Id。
    • 我不能那样路由到它,但是因为我需要 UserId 在 url 路径中,但 SomeOtherObject 没有该属性。我真的不想写自定义反序列化器。
    • 您可以从查询字符串中获取它,即 [Route("/foo")] 和 /foo?userId=...。否则我认为我们需要在 ServiceStack 中添加一个 [Route("/foo/{ignore}")] 通配符属性。 Raise an issue 如果你想要这个(这样我们就不会忘记它)。
    • 好的,刚刚添加了 {ignore} 功能 in this commit,在 ServiceStack 的下一版本中可用。
    • 我现在使用自定义模型绑定器完成了它。一旦我可以更新到新版本,该忽略路线应该会使其不那么不稳定。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2022-10-05
    • 2017-04-03
    • 2014-05-05
    相关资源
    最近更新 更多