簡體   English   中英

自托管Nancy實例中嵌入的靜態內容

[英]Embedded static content in self hosting Nancy instance

我有一個自托管的Nancy實例並將內容嵌入到程序集中(一些sshtml視圖和一些css文件)

這是我的DefaultNancyBootstrapper的內容

public class CustomBootstrapper : DefaultNancyBootstrapper
{
    private byte[] favicon;

    protected override byte[] FavIcon
    {
        get { return this.favicon ?? (this.favicon = LoadFavIcon()); }
    }

    private byte[] LoadFavIcon()
    {
        using (var resourceStream = GetType().Assembly.GetManifestResourceStream("FrontEnd.Webinterface.Views.Content.Images.Icons.FavIcon.ico"))
        {
            var memoryStream = new MemoryStream();
            resourceStream.CopyTo(memoryStream);
            return memoryStream.GetBuffer();
        }
    }

    protected override NancyInternalConfiguration InternalConfiguration
    {
        get
        {
            return NancyInternalConfiguration.WithOverrides(OnConfigurationBuilder);
        }
    }

    void OnConfigurationBuilder(NancyInternalConfiguration x)
    {
        x.ViewLocationProvider = typeof(ResourceViewLocationProvider);
    }

    protected override void ConfigureApplicationContainer(TinyIoCContainer container)
    {
        Assembly assembly = Assembly.GetExecutingAssembly();
        string[] assemblyNames = assembly.GetManifestResourceNames();

        base.ConfigureApplicationContainer(container);
        ResourceViewLocationProvider.RootNamespaces.Add(
          Assembly.GetAssembly(typeof(MainModule)), "FrontEnd.Webinterface.Views");
    }

    protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
    {
        base.ApplicationStartup(container, pipelines);
        CookieBasedSessions.Enable(pipelines);
    }

    protected override IEnumerable<ModuleRegistration> Modules
    {
        get
        {
            return

                AppDomainAssemblyTypeScanner
                    .TypesOf<INancyModule>(ScanMode.All)
                    .NotOfType<DiagnosticModule>()
                    .Select(t => new ModuleRegistration(t))
                    .ToArray();
        }
    }
}

我完全陷入了如何嵌入靜態CSS文件的困擾-有人可以幫我嗎?

編輯:

如果這在您的Nancy Assembly中,則解決方案非常簡單:https://github.com/NancyFx/Nancy/blob/master/src/Nancy.Embedded/Conventions/EmbeddedStaticContentConventionBuilder.cs

protected override void ConfigureConventions(NancyConventions nancyConventions)
        {
            Assembly Assembly = System.Reflection.Assembly.GetExecutingAssembly();

            nancyConventions.StaticContentsConventions.Add(EmbeddedStaticContentConventionBuilder.AddDirectory("Static", Assembly, @"Webinterface/Static"));
            nancyConventions.StaticContentsConventions.Add(StaticContentConventionBuilder.AddDirectory("Views", @"Webinterface/Views"));
        }

盡管您已經回答了自己的問題,但我還是想添加幾行有關對我來說很好的解決方案。

首先,這里是與該主題的討論相關的一些鏈接,其中包含有關工作原理的解釋:

第二,不是使用您在問題中提到的EmbeddedStaticContentConventionBuilder ,而是使用基於Patrick Steele第二個鏈接的源代碼的實現,這要簡單得多:

public static class StaticResourceConventionBuilder
{
    public static Func<NancyContext, string, Response> AddDirectory(string requestedPath, Assembly assembly, string namespacePrefix)
    {
        return (context, s) =>
        {
            var path = context.Request.Path;

            if (!path.StartsWith(requestedPath))
            {
                return null;
            }

            string resourcePath;
            string name;

            var adjustedPath = path.Substring(requestedPath.Length + 1);

            if (adjustedPath.IndexOf('/') >= 0)
            {
                name = Path.GetFileName(adjustedPath);
                resourcePath = namespacePrefix + "." + adjustedPath
                    .Substring(0, adjustedPath.Length - name.Length - 1)
                    .Replace('/', '.');
            }
            else
            {
                name = adjustedPath;
                resourcePath = namespacePrefix;
            }

            return new EmbeddedFileResponse(assembly, resourcePath, name);
        };
    }
}

接着

public class Bootstrapper : DefaultNancyBootstrapper
{
    protected override void ConfigureConventions(NancyConventions nancyConventions)
    {
        base.ConfigureConventions(nancyConventions);

        nancyConventions.StaticContentsConventions
            .Add(StaticResourceConventionBuilder.AddDirectory("/Scripts", GetType().Assembly, "MyAssembly.Scripts"));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM