我有一个使用精彩服务堆栈的自托管WebService / WebApplication。
我的视图嵌入在DLL中,图像也是如此。我正在使用GitHub的ResourceVirtualPathProvider
代码。它正确地找到索引页面和布局,但它找不到嵌入的images / css(可能很明显)。
我如何配置Razor插件来搜索路径提供程序。我已经检查了调试模式,路径提供商已经找到了所有的CSS和图像。他们只是没有被击溃。
修改
我尝试将AppHost的VirtualPathProvider
属性设置为我配置RazorFormat
插件的同一个提供程序,但无效。
最后编辑
感谢Mythz的回应,我现在已经开始工作并提供以下解决方案:
首先(我之前有过),我使用GitHub中的Embedded
代码创建资源虚拟路径提供程序,目录和文件。
实施了VirtualFileHandler:
public sealed class VirtualFileHandler : IHttpHandler, IServiceStackHttpHandler
{
private IVirtualFile _file;
/// <summary>
/// Constructor
/// </summary>
/// <param name="file">File to serve up</param>
public VirtualFileHandler(IVirtualFile file)
{
_file = file.ThrowIfDefault("file");
} // eo ctor
public bool IsReusable { get { return false; } }
public void ProcessRequest(HttpContext context)
{
ProcessRequest(new HttpRequestWrapper(null, context.Request),
new HttpResponseWrapper(context.Response),
null);
} // eo ProcessRequest
public void ProcessRequest(IHttpRequest request, IHttpResponse response, string operationName)
{
try
{
response.ContentType = ALHEnvironment.GetMimeType(_file.Extension);
using (Stream reader = _file.OpenRead())
{
byte[] data = reader.ReadFully();
response.SetContentLength(data.Length);
response.OutputStream.Write(data, 0, data.Length);
response.OutputStream.Flush();
}
}
catch (System.Net.HttpListenerException ex)
{
//Error: 1229 is "An operation was attempted on a nonexistent network connection"
//This exception occures when http stream is terminated by the web browser.
if (ex.ErrorCode == 1229)
return;
throw;
}
} // eo ProcessRequest
} // eo class VirtualFileHandler
在配置函数中配置了所有内容(事实上它是静态的,我的场景是独一无二的,但它是从常规AppHost的Configure
函数中有效调用的)
protected static void Configure(WebHostConfiguration config)
{
_pathProvider = new MultiVirtualPathProvider(config.AppHost,
new ResourceVirtualPathProvider(config.AppHost, WebServiceContextBase.Instance.GetType()),
new ResourceVirtualPathProvider(config.AppHost, typeof(ResourceVirtualPathProvider)));
config.Plugins.Add(new RazorFormat()
{
EnableLiveReload = false,
VirtualPathProvider = _pathProvider
});
/*
* We need to be able to locate other embedded resources other than views, such as CSS, javascript files,
* and images. To do this, we implement a CatchAllHandler and locate the resource ourselves
*/
config.AppHost.CatchAllHandlers.Add((httpMethod, pathInfo, filePath) =>
{
IVirtualFile file = _pathProvider.GetFile(pathInfo);
if (file == null)
return null;
return new VirtualFileHandler(file);
});
} // eo Configure
答案 0 :(得分:1)
您是否看过RazorRockstars的自托管版本?
RazorFormat不需要了解静态文件,它们只是由ServiceStack本身处理。
您需要将每个静态文件的构建操作设置为复制更新,以便将它们复制到bin/
目录,以便ServiceStack可以找到它们,因为它是托管自托管ServiceStack版本的基本目录。