Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
C# ServiceStack与Rest谓词匹配的新API操作_C#_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack_Restful Url - Fatal编程技术网 servicestack,restful-url,C#,servicestack,Restful Url" /> servicestack,restful-url,C#,servicestack,Restful Url" />

C# ServiceStack与Rest谓词匹配的新API操作

C# ServiceStack与Rest谓词匹配的新API操作,c#,servicestack,restful-url,C#,servicestack,Restful Url,使用较旧版本的SomeService:RestServiceBase可以将OnGet-OnPost-OnPut-OnDelete操作与相应的传入谓词匹配 对于较新的版本,假设我有以下内容: //----------------------------------------- [Route("/todos/{id}","GET")] //display request [Route("/todos/{id}", "POST")] //edit request public class Todo

使用较旧版本的
SomeService:RestServiceBase
可以将OnGet-OnPost-OnPut-OnDelete操作与相应的传入谓词匹配

对于较新的版本,假设我有以下内容:

//-----------------------------------------
[Route("/todos/{id}","GET")] //display request
[Route("/todos/{id}", "POST")] //edit request
public class Todo : IReturn<TodoResponse> {
    public long Id { get; set; }
    public string Content { get; set; }
}

public class TodoService : Service {
    public object Get(Todo request) { ... } // will GET verb know this Get() function?
    public object Post(Todo request) { ... }// will POST verb know this Post() function?
}
//-----------------------------------------
[Route(“/todos/{id}”,“GET”)]//显示请求
[路由(“/todos/{id}”,“POST”)]//编辑请求
公共类待办事项:IReturn{
公共长Id{get;set;}
公共字符串内容{get;set;}
}
公共类TodoService:服务{
公共对象Get(Todo请求){…}//Get动词是否知道这个Get()函数?
公共对象Post(Todo请求){…}//Post谓词是否知道此Post()函数?
}
动作名称“Get”“Post”不再标记为“override”,SS如何匹配正确的动词来命中Get()和Post()函数

//--------------------------------------------------------------------------

或者第二轮,现在我有一个修改

//-----------------------------------------
[Route("/todos/{id}","GET")] //display request
public class DisplayTodo : IReturn<TodoResponse> {
    public long Id { get; set; }
}
[Route("/todos/{id}", "POST")] //edit request
public class EditTodo : IReturn<TodoResponse> {
    public long Id { get; set; }
    public string Content { get; set; }
}

public class TodoService : Service {
    //different request DTOs this time ...
    public object Get(DisplayTodo request) { ... } //again, same route "/todos/{id}" 
    public object Post(EditTodo request) { ... }   //will SS get confused about the verbs? 
}
//-----------------------------------------
[Route(“/todos/{id}”,“GET”)]//显示请求
公共类显示TODO:IReturn{
公共长Id{get;set;}
}
[路由(“/todos/{id}”,“POST”)]//编辑请求
公共类Editodo:IReturn{
公共长Id{get;set;}
公共字符串内容{get;set;}
}
公共类TodoService:服务{
//这次不同的请求DTO。。。
公共对象Get(DisplayTodo请求){…}//同样,相同的路由“/todos/{id}”
公共对象Post(edittorequest){…}//学生会对动词感到困惑吗?
}
在相同的路径“/todos/{id}”下,学生如何区分上述情况下的动词


你能帮我把这两个问题整理一下吗?谢谢大家!

ServiceStack将尝试匹配请求谓词及其请求DTO。 如果其中任何一个不匹配,您将得到一条无请求处理程序消息


您的示例似乎不错,您是否遇到过任何问题?

这是智能路由部分,摘自:

匹配规则 在大多数情况下,您不需要了解这一点,因为ServiceStack的路由工作方式与您预期的一样。尽管这仍然可以作为描述ServiceStack路由解析顺序的良好参考:

  • 首先使用任何精确的文字匹配
  • 精确的动词匹配比所有动词都好
  • 路线中的变量越多,其权重越小
  • 当路由具有相同权重时,顺序由动作在服务中的位置或注册顺序(FIFO)决定
  • 只有当有多个路由与传入请求的pathInfo匹配时,这些规则才起作用

    让我们使用新API设计测试套件中定义的路由查看这些规则的一些示例:

    [Route("/reqstars")]
    public class Reqstar {}
    
    [Route("/reqstars", "GET")]
    public class AllReqstars {}
    
    [Route("/reqstars/{Id}", "GET")]
    public class GetReqstar {}
    
    [Route("/reqstars/{Id}/{Field}")]
    public class ViewReqstar {}
    
    [Route("/reqstars/{Id}/delete")]
    public class DeleteReqstar {}
    
    [Route("/reqstars/{Id}", "PATCH")]
    public class UpdateReqstar {}
    
    [Route("/reqstars/reset")]
    public class ResetReqstar {}
    
    [Route("/reqstars/search")]
    [Route("/reqstars/aged/{Age}")]
    public class SearchReqstars {}
    
    这些是这些HTTP请求的结果

    GET   /reqstars           =>    AllReqstars
    POST  /reqstars           =>    Reqstar
    GET   /reqstars/search    =>    SearchReqstars
    GET   /reqstars/reset     =>    ResetReqstar
    PATCH /reqstars/reset     =>    ResetReqstar
    PATCH /reqstars/1         =>    UpdateReqstar
    GET   /reqstars/1         =>    GetReqstar
    GET   /reqstars/1/delete  =>    DeleteReqstar
    GET   /reqstars/1/foo     =>    ViewReqstar
    
    如果有多条完全相同的路线声明如下:

    [Route("/req/{Id}", "GET")]
    public class Req2 {}
    
    [Route("/req/{Id}", "GET")]
    public class Req1 {}
    
    public class MyService : Service {
        public object Get(Req1 request) { ... }     
        public object Get(Req2 request) { ... }     
    }
    
    首先声明的操作上的路由被选中,即:

    GET /req/1              => Req1