使用ServiceStack

时间:2018-03-15 18:00:19

标签: c# regex routing .net-core servicestack

我正在尝试使用ServiceStack构建一个小型.NET Core服务器,并希望使用正则表达式进行路由。到目前为止,我基本上只创建了一个Hello World项目并将其连接到数据库。

我在ServiceModel项目中有这些类:

[Route("/hello/{Language}/{Name*}", Matches = @"PathInfo =~ \/hello\/[a-z]{2}\/[A-Za-z]+$")]
public class HelloTo : IReturn<HelloResponse> {
    public string Language { get; set; }
    public string Name { get; set; }
}

[Route("/hello/{Language*}", Matches = @"PathInfo =~ \/hello\/[a-z]{2}$")]
public class Hello : IReturn<HelloResponse> {
    public string Language { get; set; }
}

public class HelloResponse {
    public string Result { get; set; }
}

这在我的ServiceInterface项目中:

public HelloResponse Any(HelloTo request) {
    var greeting = Db.SingleById<Greeting>(request.Language);
    return new HelloResponse { Result = $"{greeting.Text}, {request.Name}!" };
}

public HelloResponse Any(Hello request) {
    var greeting = Db.SingleById<Greeting>(request.Language);
    return new HelloResponse { Result = $"{greeting.Text}, you!" };
}

重点是,当我发送时,例如此请求:http://localhost/hello/fr,它转到第一条路线,即使其中没​​有名称

据我所知,第二条路线无法使用此配置。经过一些实验,在我看来,似乎完全忽略了匹配参数,这让我觉得我可能需要启用一些东西。但是,除了简短的注释here之外,我无法找到相关的文档。使用正则表达式的路由应该可能有点像这样。

请注意,如果我将第二条路线从Route("/hello/{Language*}"更改为Route("/hello/{Language}",此示例将按预期工作,可能是因为没有通配符的路线优先,但我需要以这样的通配符结尾的路线具有实际用途。

1 个答案:

答案 0 :(得分:2)

此问题是由于匹配规则尚未针对通配符路由进行验证,现在已从this commit解析,您的示例将按照预期的ServiceStack v5.0.3正常工作available on MyGet