Rest 在ServiceStack中组合URL和POST变量
我正在尝试将现有的wcf rest api转换为ServiceStack,但出现了一些问题:Rest 在ServiceStack中组合URL和POST变量,rest,routing,
servicestack,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中提供用户ID,并在post正文中提供其他对象
[Route("foo/{userId}","POST")]
public class MyInputModel : IReturnVoid
{
public string userId { get; set; }
public SomeOtherObject properties { get; set; }
}
这里的意图是,我将在url中提供用户ID,并在post正文中提供其他对象的实例。我得到的错误是
<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'.
无法使用MyInputModel反序列化“应用程序/xml”请求
错误:System.Runtime.Serialization.SerializationException:
第1行位置42出现错误。应为元素“MyInputModel”
从名称空间“blahblahblah”。。遇到名为的“元素”
“SomeOtherObject”,命名空间'http://blahblahblah'.
我唯一能想到的就是将xml封装在MyInputModel
中,让序列化程序满意。这实际上不是向后兼容的选项
我还可以将SomeOtherObject
修改为顶级输入模型,并在其中添加UserId
属性,但这也感觉不太理想,因为它是整个api中使用的对象,实际上并不与用户id绑定。它也已经独立发布,因此在那里进行更改会很痛苦
是否有任何方法表明发布数据的根元素将是
SomeOtherObject
而不是MyInputModel
?在WebApi中,这将使用[FromBody]
属性等等。servicestack有类似的功能吗?DTO的目的是自动生成有线格式,这就是为什么要求请求DTO与传入请求的形状相匹配。ServiceStack之所以如此高效,部分原因在于它是一个代码优先的web服务框架,它鼓励从C#开始并向外投影,也就是说,您的客户机应该绑定到您的web服务输出,而不是将代码优先模型映射到现有的模式输入
话虽如此,列出了用您自己的绑定覆盖ServiceStack的默认请求绑定的不同方法
访问任何服务或筛选器中的HTTP请求变量
并非所有内容都需要映射到DTO,因为任何HTTP变量仍然可以从任何服务或筛选器访问,即:
base.Request.QueryString
base.Request.FormData
base.Request.Headers[name]
base.Request.PathInfo
base.Request.AbsoluteUri
DTO的目的是自动生成导线格式,这就是为什么要求请求DTO与传入请求的形状相匹配。ServiceStack之所以如此高效,部分原因在于它是一个代码优先的web服务框架,它鼓励从C#开始并向外投影,也就是说,您的客户机应该绑定到您的web服务输出,而不是将代码优先模型映射到现有的模式输入 话虽如此,列出了用您自己的绑定覆盖ServiceStack的默认请求绑定的不同方法 访问任何服务或筛选器中的HTTP请求变量 并非所有内容都需要映射到DTO,因为任何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}”)]通配符属性。如果你想要这个(这样我们就不会忘记了)。好吧,只是添加了{ignore}
功能,在下一个版本的ServiceStack中可用。我现在用一个自定义模型绑定器完成了。一旦我可以更新到新版本,这种忽略路线应该会使它不那么危险。谢谢这实际上很有道理。如果我是从头开始设计这个服务,我肯定会做一些不同的事情,但是我的手有点被现有的api束缚住了。在我的例子中,我可以创建输入模型SomeOtherObject
并从路径中读取Id。但是,我不能这样路由到它,因为我需要UserId位于url路径中,但是SomeOtherObject
没有该属性。我真的不想编写自定义反序列化程序。您可以从查询字符串中获取它,即[Route(“/foo”)]和/foo?userId=…
。否则,我认为我们需要在ServiceStack中添加一个[Route(“/foo/{ignore}”)]通配符属性。如果你想要这个(这样我们就不会忘记了)。好吧,只是添加了{ignore}
功能,在下一个版本的ServiceStack中可用。我现在用一个自定义模型绑定器完成了。一旦我可以更新到新版本,这种忽略路线应该会使它不那么危险。谢谢