3

私は素晴らしいサービス スタックを使用して、自己ホスト型の WebService/WebApplication を持っています。

私のビューは DLL に埋め込まれており、画像も同様です。ResourceVirtualPathProviderGitHubのコードを使用しています。インデックス ページとレイアウトは正しく検出されますが、埋め込まれた画像/CSS は検出されません (おそらく明らかに)。

パス プロバイダーを検索するように Razor プラグインを構成するにはどうすればよいでしょうか。デバッグ モードでチェックしたところ、パス プロバイダーがすべての CSS と画像を見つけました。彼らはルーティングされていません。

編集

AppHost のプロパティを、プラグインVirtualPathProviderを構成したのと同じプロバイダーに設定しようとしましたが、役に立ちませんでした。RazorFormat

最終編集

Mythz の回答のおかげで、これが機能するようになり、以下の解決策を提供できるようになりました。

  1. まず (これは以前にもありました)、GitHubEmbeddedのコードを使用して、リソースの仮想パス プロバイダー、ディレクトリ、およびファイルを作成しました。

  2. 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
    
  3. 構成関数ですべてを構成しました (静的であるという事実は私のシナリオに固有のものですが、通常の 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
    
4

1 に答える 1