我正在尝试使用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}"
,此示例将按预期工作,可能是因为没有通配符的路线优先,但我需要以这样的通配符结尾的路线具有实际用途。
答案 0 :(得分:2)
此问题是由于匹配规则尚未针对通配符路由进行验证,现在已从this commit解析,您的示例将按照预期的ServiceStack v5.0.3正常工作available on MyGet。