【问题标题】:Embedded static content in self hosting Nancy instance在自托管 Nancy 实例中嵌入静态内容
【发布时间】:2016-10-26 23:41:26
【问题描述】:

我有一个自托管的 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"));
        }

【问题讨论】:

  • 并将内容嵌入到程序集中 - 请解释一下?这些静态文件通常不会捆绑到程序集中。您能否详细说明一下您的解决方案结构。谢谢
  • 我有一个解决方案,其中包含一些 Windows 表单和 Nancy Web 界面作为自托管实例。我想要一个完全开箱即用的解决方案,它在我将分发的一个 .exe 文件中包含所有 *、dll、Nancy 视图、图像、CSS。所以是的,我还嵌入了这些静态文件,如 CSS 和图像。
  • 你为什么要这个?为什么所有内容都是单个 exe 很重要?
  • 我只想要它 :) 我的应用程序应该是可移植的。我不喜欢我的 .exe 文件周围有很多依赖文件。我希望我的整个项目能够开箱即用地运行这个单一的可执行文件。我可以想象这不是最佳实践,但我想拥有这个“功能”。
  • 好吧,这是非正统的,但我想可能,但不知道你会怎么做。我已经删除了我的答案,因为它在这种情况下没有帮助。

标签: c# nancy


【解决方案1】:

虽然您自己已经回答了您的问题,但我想添加几行关于对我来说效果很好的解决方案。

首先,这里有一些关于该主题的讨论链接,其中包含对工作原理的解释:

其次,我使用基于 Patrick Steele 的第二个链接的源代码的实现,而不是您在问题中提到的 EmbeddedStaticContentConventionBuilder,这更简单:

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"));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多