servicestack 如何查询特定路由的AppHost?
基本上我有以下架构:servicestack 如何查询特定路由的AppHost?,servicestack,servicestack,基本上我有以下架构: 网站项目(1) 域名项目(2) Api项目(3) 依赖项: 1使用2和3 3使用2 2什么都不用 在我的Api项目中,我定义了ServiceStack.Webhost.Endpoints.AppHostBase的具体实现,例如ApiAppHost: public sealed class ApiAppHost : AppHostBase { private ApiAppHost() : base("Description", typeof (
- 网站项目(1)
- 域名项目(2)
- Api项目(3)
- 1使用2和3
- 3使用2
- 2什么都不用
ServiceStack.Webhost.Endpoints.AppHostBase
的具体实现,例如ApiAppHost
:
public sealed class ApiAppHost : AppHostBase
{
private ApiAppHost()
: base("Description", typeof (ApiAppHost).Assembly) {}
public override void Configure(Container container)
{
this.SetConfig(new EndpointHostConfig
{
ServiceStackHandlerFactoryPath = "api"
});
this.Routes.Add<Foo>("/foo", "POST");
}
public static void Initialize()
{
var instance = new ApiAppHost();
instance.Init();
}
}
公共密封类ApiAppHost:AppHostBase
{
私有ApiAppHost()
:base(“Description”,typeof(ApiAppHost).Assembly{}
公共覆盖无效配置(容器)
{
此.SetConfig(新的EndpointHostConfig
{
ServiceStackHandlerFactoryPath=“api”
});
这个.Routes.Add(“/foo”,“POST”);
}
公共静态void Initialize()
{
var instance=new ApiAppHost();
Init();
}
}
这很直截了当
现在我想从我的网站项目中查询我的this.Routes
(与EndpointHostConfig.ServiceStackHandlerFactoryPath
)以获得Foo
的特定路径
我如何在不自己创建拦截器的情况下做到这一点?ServiceStack.Net是否提供了适合的服务?目前我正在做类似的事情
public static class AppHostBaseExtensions
{
public static string GetUrl<TRequest>(this AppHostBase appHostBase)
{
var requestType = typeof (TRequest);
return appHostBase.GetUrl(requestType);
}
public static string GetUrl(this AppHostBase appHostBase, Type requestType)
{
var endpointHostConfig = appHostBase.Config;
var serviceStackHandlerFactoryPath = endpointHostConfig.ServiceStackHandlerFactoryPath;
var serviceRoutes = appHostBase.Routes as ServiceRoutes;
if (serviceRoutes == null)
{
throw new NotSupportedException("Property Routes of AppHostBase is not of type ServiceStack.ServiceHost.ServiceRoutes");
}
var restPaths = serviceRoutes.RestPaths;
var restPath = restPaths.FirstOrDefault(arg => arg.RequestType == requestType);
if (restPath == null)
{
return null;
}
var path = restPath.Path;
var virtualPath = "~/" + string.Concat(serviceStackHandlerFactoryPath, path); // bad, i know, but combining with 2 virtual paths ...
var absolutePath = VirtualPathUtility.ToAbsolute(virtualPath);
return absolutePath;
}
}
公共静态类AppHostBaseExtensions
{
公共静态字符串GetUrl(此AppHostBase AppHostBase)
{
var requestType=typeof(TRequest);
返回appHostBase.GetUrl(requestType);
}
公共静态字符串GetUrl(此AppHostBase AppHostBase,类型requestType)
{
var endpointHostConfig=appHostBase.Config;
var serviceStackHandlerFactoryPath=endpointHostConfig.serviceStackHandlerFactoryPath;
var serviceRoutes=appHostBase.Routes作为serviceRoutes;
if(serviceRoutes==null)
{
抛出新的NotSupportedException(“AppHostBase的属性路由不是ServiceStack.ServiceHost.ServiceRoutes类型”);
}
var restPaths=serviceRoutes.restPaths;
var restPath=restPaths.FirstOrDefault(arg=>arg.RequestType==RequestType);
if(restPath==null)
{
返回null;
}
var path=restPath.path;
var virtualPath=“~/”+string.Concat(serviceStackHandlerFactoryPath,path);//我知道这不好,但与两个虚拟路径结合使用。。。
var absolutePath=virtualPath.ToAbsolute(virtualPath);
返回绝对路径;
}
}
我知道这是错误的,因为存在很多问题(路径组合、不考虑rest路径、不考虑带有占位符的rest路径),但它可以作为一个开始
编辑:
只有在AppHostBase
-实现的Configure(Container)
中注册路由时,这才有效。它不能与RestServiceAttribute
-属性一起使用