ServiceStack路由不与查询字符串工作(ServiceStack Routing does

2019-06-27 11:41发布

我有ServiceStack建立了一个简单的REST服务。

如果我配置是这样的路线:

        //register user-defined REST-ful urls
        Routes
            .Add<Contact>("/Contacts")
            .Add<Contact>("/Contacts/{ContactId}")

该请求成功。

http://<server>:59557/Contacts?ContactId=9999 //Works

如果我配置这样的路由(业务分析师更倾向于生成的元数据)

        //register user-defined REST-ful urls
        Routes
            .Add<UpdateContact>("/UpdateContact", "PUT")
            .Add<CreateContact>("/CreateContact", "POST")
            .Add<GetContact>("/Contacts/{ContactId}", "GET")

http://<server>:59557/Contacts/9999           //Works
http://<server>:59557/Contacts?ContactId=9999 //Fails, Handler for request not found

我怎样才能在第二样品中配置路由,这样的请求/联系人?使用ContactID = 9999会成功吗?

谢谢。

Answer 1:

一些在路由ServiceStack是在解释你的第一个网站解释维基页面:

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

仅匹配:

/hello/name

其中为:

[Route("/hello")]

火柴:

/hello?Name=XXX

注:查询字符串,FORMDATA和HTTP请求正文不是路线(即仅/路/信息是)的一部分,但它们都可以在除了每个Web服务调用被用来进一步填充请求DTO。

并利用具有通配符路径的路线,如:

[Route("/hello/{Name*}")]

火柴:

/hello
/hello/name
/hello/my/name/is/ServiceStack

另一个很好的用例何时使用通配符路线 。

因此,要匹配/Customers?Key=Value/Customers/{Id}您需要注册为匹配这两个途径,例如路线:

Routes
    .Add<GetContact>("/Contacts", "GET")
    .Add<GetContact>("/Contacts/{ContactId}", "GET")

如何根据公约,自动注册路线为大家服务

也与此相关的是通过所述登记自动路由AddFromAssembly扩展方法,其中,该单一呼叫:

Routes.AddFromAssembly(typeof(MyService).Assembly)

经过和scands所有服务(在指定的组件)的基础上,你已经实现了所有HTTP方法和寄存器以公约为基础的路线。 例如,如果你的GetContactUpdateContact服务有Id的属性它会自动注册下列路线:

Routes
    .Add<GetContact>("/Contacts", "GET")
    .Add<GetContact>("/Contacts/{Id}", "GET")
    .Add<UpdateContact>("/Contacts", "POST PUT")
    .Add<UpdateContact>("/Contacts/{Id}", "POST PUT")

如果你只是有一个单一的Contacts REST服务与所有的HTTP动词,将注册这些途径实现:

Routes
    .Add<Contacts>("/Contacts", "GET POST PUT DELETE PATCH")
    .Add<Contacts>("/Contacts/{Id}", "GET POST PUT DELETE PATCH")

路由解析顺序

这是更详细的描述在新的API设计维基但用于选择路径加权的依据是:

  1. 任何确切的文字比赛首次使用
  2. 精确匹配动词优于所有动词
  3. 路线中的多个变量的加权较少有
  4. 当路由具有相同的重量时,为了通过在服务或注册的顺序的行动(FIFO)的位置来确定

请参阅智能路由的维基示例部分。

很好的表现;很好的绩效

由于在MVC路由可能会很慢 ,当你有大量的航线,我认为这是值得指出ServiceStack的路由实现与哈希查询实现,因此不会受到你可能曾与MVC的线性性能回归问题。



Answer 2:

继在其他的StackOverflow职位的答案 ,你可以尝试这条路线:

/Contacts/{Ids*}

并使用此请求类:

public class ContactRequest { public string Ids { get; set; } }

然后给出的URL <service>/Contacts?Id=1&Id=2&Id=3 ServiceStack将填充Ids与下面的字符串请求对象的属性:

Id=1&Id=2&Id=3

然后你可以解析成的ID,如清单

public object Get(ContactRequest request)
{
    var idPairs = request.Ids.Split("&");
    var ids = new List<string>();
    foreach (var idPair in idPairs)
    {
        ids.Add(idPair.Split("=")[1];
    }
    // ... do something with your ids now ...
    // ... return results ...
}

当然,你可能还需要整个包住ID解析逻辑在try...catch块来处理格式不正确的查询字符串。



文章来源: ServiceStack Routing does not work with querystring