Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rest 在ServiceStack中组合URL和POST变量_Rest_Routing_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,Rest,Routing,servicestack" /> servicestack,Rest,Routing,servicestack" />

Rest 在ServiceStack中组合URL和POST变量

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正文中提供其他对象

我正在尝试将现有的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正文中提供其他对象的实例。我得到的错误是

<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中可用。我现在用一个自定义模型绑定器完成了。一旦我可以更新到新版本,这种忽略路线应该会使它不那么危险。谢谢