[英]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.