我有一个ServiceStack自托管Web服务,使用AppSelfHostBase
。
执行配置方法时,我有这个:
public override void Configure(Container container)
{
Config.RouteNamingConventions = new List<RouteNamingConventionDelegate> {
RouteNamingConvention.WithRequestDtoName,
RouteNamingConvention.WithMatchingAttributes,
RouteNamingConvention.WithMatchingPropertyNames,
};
Routes.AddFromAssembly(typeof(ServiceStackHost).Assembly);
我希望以下服务/StartBankIdAuthentication
路径下执行,但它驻留在/json/reply/StartBankIdAuthentication
下。
public class StartBankIdAuthentication : IReturn<StartBankIdAuthenticationResponse>
{
public string IdNbr { get; set; }
}
另外,有没有一种自动方法可以使 DTO 中的属性位于"子路径"下,例如/StartBankIdAuthentication/1234
而不是/StartBankIdAuthentication?IdNbr=1234
?
我知道我可以手动添加Route
属性,但它在许多方面似乎很麻烦而且也很混乱(不是类型化、容易出错等(。
我希望以下服务
/StartBankIdAuthentication
路径下执行,但它驻留在/json/reply/StartBankIdAuthentication
下。
/json/reply/StartBankIdAuthentication
是预定义的路由,默认情况下始终可用,它们与自动生成的路由无关。
您列出的默认路由生成策略已默认注册,并且是使用Routes.AddFromAssembly()
时应用的策略。除了默认值之外,您只应使用所需的路由策略进行覆盖,并且应将SetConfig()
用于 ServiceStack 中的任何配置,例如:
SetConfig(new HostConfig {
RouteNamingConventions = { MyCustomRouteStrategy }
});
ServiceStack 中可用的不同路由策略的实现在 RouteNamingConvention.cs 中,您需要为所需的任何其他路由策略注册自己的策略。
默认情况下,会为任何Id
或IDs
属性生成其他路由,路由文档显示了如何自定义它们的示例:
现有规则可以通过修改相关的静态属性来进一步定制,例如:
RouteNamingConvention.PropertyNamesToMatch.Add("UniqueId");
RouteNamingConvention.AttributeNamesToMatch.Add("DefaultIdAttribute");
这将使这些请求 DTO:
class MyRequest1
{
public UniqueId { get; set;}
}
class MyRequest2
{
[DefaultId]
public CustomId { get; set;}
}
生成以下路由:
/myrequest1
/myrequest1/{UniqueId}
/myrequest2
/myrequest2/{CustomId}
我知道我可以手动添加 Route 属性,但它在许多方面似乎很麻烦而且也很混乱(不是类型化、容易出错等(。
如果您确实需要,可以将nameof()
用于类型化路由:
[Route("/" + nameof(StartBankAuthentication) +"/"+ nameof(StartBankAuthentication.IdNbr))]
我不确定 Mythz 是否会想出一个更好的解决方案,但我设法通过覆盖 GetRouteAttributes 来实现我想要的,通过使用反射,我可以创建我想要的。它看起来像这样:
public override RouteAttribute[] GetRouteAttributes(Type requestType)
{
string fullname = requestType.FullName.Replace("AlfaOnlineServiceModel.Api.", "");
string path = "/" + fullname.ToLower().Replace(".", "/");
RouteAttribute[] routes = base.GetRouteAttributes(requestType);
if (routes.Length == 0)
{
routes = new RouteAttribute[1];
PropertyInfo[] pInfos = requestType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.DeclaredOnly);
foreach(PropertyInfo pi in pInfos)
{
path += "/{" + pi.Name + "}";
}
routes[0] = new RouteAttribute(path);
}
return routes;
}
这将给出例如:
MyMethodResult
The following routes are available for this service:
All Verbs /myCoolPath/mySubPath/myMethod/{MyProperty}