在ServiceStack中组合URL和POST变量

时间:2013-02-20 18:16:35

标签: rest routing servicestack

我正在尝试将现有的wcf rest api转换为ServiceStack,并且正在解决问题:

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

这里的意图是我将在url中提供userId,并在post主体中提供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的{​​{1}}内容?在WebApi中,这将是MyInputModel属性和诸如此类的东西。 servicestack有类似的东西吗?

1 个答案:

答案 0 :(得分:4)

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