ServiceStack服务和DTO路由的HTTP谓词

时间:2016-08-03 02:18:46

标签: servicestack

我是ServiceStack的新手。从wiki开始,Service类具有Any,Get..etc HTTP Verb函数来获取DTO对象。 DTO routing可以使用HTTP Verb来限制路由。这些服务和DTO路由如何协同工作或这两个HTTP动词限制匹配多少?

例如,如果服务只有Get功能,但DTO有Put限制,是否意味着没有路由匹配?

public class HelloService : Service
{
    public object Get(Hello request)
    {
        return new HelloResponse { Result = "Hello, " + request.Name };
    }
}

[Route("/hello/{Name}", "PUT")]
public class Hello
{
    public string Name { get; set; }
}

我在哪里可以找到有关这些的更多信息?

谢谢,

1 个答案:

答案 0 :(得分:1)

您的自定义路由和服务实施访问是分离的。路由定义了什么自定义路由可用于调用您的服务,而您的服务实现定义了您的服务可以处理的请求。

注意:您的服务不仅限于并且可以在自定义路线之外调用,例如使用Pre-defined RoutesMessagingService Gateway等时

因此,您的路线定义定义了它允许的自定义路线,其中:

[Route("/hello/{Name}", "PUT")]

仅匹配以PUT开头的/hello请求,例如:

 PUT /hello/foo

但是如果有人发出PUT /hello/foo请求ServiceStack将抛出一个Not Implemented Exception,因为它无法找到一个可以处理该请求的方法实现,该请求对于PUT请求必须是:

public object Put(Hello request) { ... }

Any()后备可以处理 ANY HTTP谓词上的请求:

public object Any(Hello request) { ... }

除非您对同一个请求DTO有多个实施,否则我建议坚持使用Any()来实施您的服务,例如:

public object Any(Hello request) { ... }

这样,您的自定义路由可以限制允许的路由,当请求匹配时,它将调用最佳匹配实现或回退到Any()实现。