我正在尝试将现有的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有类似的东西吗?
答案 0 :(得分:4)
DTO的目的是自动生成有线格式,这就是为什么ServiceStack要求请求DTO与传入请求的形状相匹配的原因。使ServiceStack如此高效的部分原因在于它是一个代码优先的Web服务框架,它鼓励从 C#开始并突出,即您的客户端应该绑定到您的Web服务输出而不是反过来将代码优先模型映射到现有模式输入。
话虽如此,Serialization / Deserialization wiki page列出了覆盖ServiceStack与您自己的默认请求绑定的不同方法。
并非所有内容都需要映射到DTO,因为仍然可以从任何服务或过滤器提供的IHttpRequest访问任何HTTP变量,即:
base.Request.QueryString
base.Request.FormData
base.Request.Headers[name]
base.Request.PathInfo
base.Request.AbsoluteUri