ServiceStack:Routes.AddFromAssembly仍然使用/json/reply path,并且没有



我有一个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 中,您需要为所需的任何其他路由策略注册自己的策略。

默认情况下,会为任何IdIDs属性生成其他路由,路由文档显示了如何自定义它们的示例:

现有规则可以通过修改相关的静态属性来进一步定制,例如:

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}     

相关内容

  • 没有找到相关文章

最新更新