私は素晴らしいサービス スタックを使用して、自己ホスト型の WebService/WebApplication を持っています。
私のビューは DLL に埋め込まれており、画像も同様です。ResourceVirtualPathProvider
GitHubのコードを使用しています。インデックス ページとレイアウトは正しく検出されますが、埋め込まれた画像/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