我将ServiceStack(V5.1.0)作为Windows服务,提供REST API,没有任何问题。我想创建一个插件来提供来自特定物理目录的静态文件,用于以/ GUI开头的任何路由。
我已阅读"问:具有多个SPA的ServiceStack Razor"这里ServiceStack Razor with Multiple SPAs
但这似乎只处理像index.html这样的单个文件,我不仅要提供物理路径根目录中的文件,还需要提供物理路径子目录中的文件。例如,路由/GUI/css/site.css应该提供在根目录下的css子目录中找到的site.css文件。
我查看了"映射ServiceStack中的静态文件目录"这里 https://forums.servicestack.net/t/mapping-static-file-directories-in-servicestack/3377/1 并基于此,尝试重写 GetVirtualFileSources
public class AppHost : AppSelfHostBase {
...
// override GetVirtualFileSources to support multiple FileSystemMapping.
// Allow plugins to add their own FileSystemMapping
public override List<IVirtualPathProvider> GetVirtualFileSources()
{
var existingProviders = base.GetVirtualFileSources();
// Hardcoded now, will use a IoC collection populated by plugins in the future. Paths will be either absolute, or relative to the location at which the Program assembly is located.
existingProviders.Add(new FileSystemMapping("GUI",@"C:\Obfuscated\netstandard2.0\blazor"));
return existingProviders;
}
....
}
并在插件中使用FallBackRoute&#39;模型,
[FallbackRoute("/GUI/{PathInfo*}")]
public class FallbackForUnmatchedGUIRoutes : IReturn<IHttpResult>
{
public string PathInfo { get; set; }
}
但我无法弄清楚如何使用接口方法将PathInfo更改为实现IVirtualFile的对象。
public HttpResult Get(FallbackForUnmatchedGUIRoutes request)
{
// If no file is requested, default to "index.html"" file name
var cleanPathInfo = request.PathInfo ?? "index.html";
// Somehow, need to convert the cleanPathInfo into an IVirtualFile, that specifies the correct VirtualPathProvider (indexed by "GUI"")
// insert here the magic code to convert cleanPathInfo into an object that implements IVirtualFile
// var cleanVirtualPathInfo = cleanPathInfo as IVirtualFile
// to make use of ServiceStack enhanced functionality, wrap the cleanVirtualPathInfo in a HttpResult,
HttpResult httpresult = new HttpResult(cleanPathInfo,false); // this doesn't compile, because no overload with 2 parameters takes a string as the first parameter, but there is an overload that will take an IVirtualFile object
return httpresult;
}
任何使接口代码返回正确文件的建议?或者是一种更好的方式来允许多个插件,每个插件都支持不同的SPA,基于路线的第一部分?提示,链接,明确指示 - 欢迎任何和所有人!
答案 0 :(得分:0)
您只需注册一个Virtual File System,您就不需要创建自己的服务,因为ServiceStack的静态文件处理程序会自动返回它在注册虚拟列表中找到的第一个文件文件来源。
如果您希望能够在插件中注册文件映射,可以将其添加到插件构造函数中的AppHost AddVirtualFileSources
列表中,例如:
public class GuiPlugin : IPlugin, IPreInitPlugin
{
public void Configure(IAppHost appHost)
{
appHost.AddVirtualFileSources.Add(
new FileSystemMapping("GUI", appHost.MapProjectPath("~/blazor")));
}
public void Register(IAppHost appHost) {}
}
appHost.MapProjectPath()
可让您从AppHost的项目内容路径中解析物理文件。然后,您可以使用以下命令在AppHost中注册插件:
public override void Configure(Container container)
{
Plugins.Add(new GuiPlugin());
}
/blazor
中的文件现在应该可以从您注册的路径映射中解析,例如:
/GUI/file.html -> C:\project\path\file.html
请注意,您不需要任何服务,ServiceStack会自动返回已注册文件映射的静态文件,因此您希望删除已添加的任何[FallbackRoute]
。