Asp.net core asp.net Core 1.1外部程序集中的嵌入式样式表
我正在使用VS.2017社区版和15.2更新版(26430.12)在我的解决方案中,我有一个主ASP.NET Core 1.1web应用程序和一个单独的程序集,它是一个.NET Core类库,我对其进行了装配,使其成为web SDK类库,并从中向主web应用程序提供视图组件。那很好 然而,我刚刚添加了两个局部视图(稍后可能是视图组件),但这两个视图尤其需要包含样式表(CSS)文件。因为我希望所有东西都像可视化组件一样是自包含的,所以我创建了一个wwwroot\css文件夹,并将我的css放在其中,使其成为嵌入式资源 问题是。。。。在我的主web应用程序中,如果样式表嵌入到外部程序集中,如何在ASP.NET Core布局文件中对该样式表进行流式处理?基于 ,我认为理论上,您可以向静态文件中间件添加一个嵌入式文件提供程序,如下所示:Asp.net core asp.net Core 1.1外部程序集中的嵌入式样式表,asp.net-core,asp.net-core-mvc,embedded-resource,Asp.net Core,Asp.net Core Mvc,Embedded Resource,我正在使用VS.2017社区版和15.2更新版(26430.12)在我的解决方案中,我有一个主ASP.NET Core 1.1web应用程序和一个单独的程序集,它是一个.NET Core类库,我对其进行了装配,使其成为web SDK类库,并从中向主web应用程序提供视图组件。那很好 然而,我刚刚添加了两个局部视图(稍后可能是视图组件),但这两个视图尤其需要包含样式表(CSS)文件。因为我希望所有东西都像可视化组件一样是自包含的,所以我创建了一个wwwroot\css文件夹,并将我的css放在其中
var embeddedFiles = new EmbeddedFileProvider(
typeof(yourtype).GetTypeInfo().Assembly,
"your.assembly.name"
);
builder.UseStaticFiles(new StaticFileOptions()
{
FileProvider = embeddedFiles
//,RequestPath = new PathString("/files") // optionally use a path other than /
});
如果这种方法有效,它可能是最好的,但我自己没有尝试过,所以不是100%肯定有效。目前在我的项目中,我刚刚添加了控制器操作,它返回我的嵌入式静态资源,您可以在我的项目中的css、js和字体actionmethods中看到这些资源
我的FileManagerController需要css、js和字体,因此我为每一种都提供了操作方法和一个私人助手操作方法。它是有效的,但当我有机会时,我会尝试另一种方法,因为它的代码要少得多。
我的资源的URL类似于[controller]/action,所以在我的例子中是filemanager/css、filemanager/js、filemanager/font
更新2017-06-09:我现在已经使用StaticFiles中间件方法在我自己的项目中实现了为嵌入式静态资源提供服务。我可以确认它在一般情况下是有效的,但是如果嵌入的资源有任何-在文件夹中的段,则会出现一个问题,因为-在文件夹中的段需要更改为u以查找资源,但-在文件名是可以的。EmbeddedFileProvider没有处理这个问题,所以我报告了一个问题,并在我的项目中使用解决方案解决了它
如上所述,还可以从控制器操作中提供静态资源,但MVC在身份验证/授权中间件之后运行,因此结果是这些中间件在处理静态文件请求时运行,而使用在此之前运行的静态文件中间件可以避免这种情况。我想,如果需要保护嵌入式静态资源,那么使用控制器操作将是一种方法,但在我的情况下,我不需要它。基于
,我认为理论上,您可以向静态文件中间件添加一个嵌入式文件提供程序,如下所示:
var embeddedFiles = new EmbeddedFileProvider(
typeof(yourtype).GetTypeInfo().Assembly,
"your.assembly.name"
);
builder.UseStaticFiles(new StaticFileOptions()
{
FileProvider = embeddedFiles
//,RequestPath = new PathString("/files") // optionally use a path other than /
});
如果这种方法有效,它可能是最好的,但我自己没有尝试过,所以不是100%肯定有效。目前在我的项目中,我刚刚添加了控制器操作,它返回我的嵌入式静态资源,您可以在我的项目中的css、js和字体actionmethods中看到这些资源
我的FileManagerController需要css、js和字体,因此我为每一种都提供了操作方法和一个私人助手操作方法。它是有效的,但当我有机会时,我会尝试另一种方法,因为它的代码要少得多。
我的资源的URL类似于[controller]/action,所以在我的例子中是filemanager/css、filemanager/js、filemanager/font
更新2017-06-09:我现在已经使用StaticFiles中间件方法在我自己的项目中实现了为嵌入式静态资源提供服务。我可以确认它在一般情况下是有效的,但是如果嵌入的资源有任何-在文件夹中的段,则会出现一个问题,因为-在文件夹中的段需要更改为u以查找资源,但-在文件名是可以的。EmbeddedFileProvider没有处理这个问题,所以我报告了一个问题,并在我的项目中使用解决方案解决了它
如上所述,还可以从控制器操作中提供静态资源,但MVC在身份验证/授权中间件之后运行,因此结果是这些中间件在处理静态文件请求时运行,而使用在此之前运行的静态文件中间件可以避免这种情况。我想,如果需要保护嵌入式静态资源,那么使用控制器操作将是一种实现这一点的方法,但在我的情况下,我并不需要它。好吧,到目前为止,对我来说,这个.NET核心的事情是使我的生活复杂化,而不是使它更简单。无论如何,我设法获得了驻留在同一个外部程序集中的CSS文件,其中(外部)视图组件嵌入在我的_布局中 首先,我向主web应用程序的SampleAPIAPI控制器添加了一个新的API方法。此API方法检索外部程序集中的嵌入式资源并获取其流 假设需要自定义CSS的视图组件嵌入的外部程序集的完整命名空间具有命名空间
ExternalAssembly.proj
css\
my-view-component.css
ViewComponents\
MyViewComponent.cs
Views\
Shared\
Components\
MyViewComponent\
Default.cshtml
Default.cshtml文件和CSS文件在项目中标记为嵌入式资源
API控制器上的API方法如下所示,我的应用程序是ASP.NET Core 1.1 MVC,但也有一个API。API方法负责将CSS文件作为流返回,以便在布局页面中使用:
[HttpGet("cssMyViewComponent")]
public IActionResult GetCss(string id) {
var stream = typeof(ExternalAssembly.ViewComponents.MyViewComponent)
.GetTypeInfo().Assembly
.GetManifestResourceStream("ExternalAssembly.css.my-view-component.css");
}
确保获得嵌入资源的实际名称,注意css文件夹名称是该资源的完整命名空间的一部分。如果不确定,可以使用ILDASM打开外部程序集并查找资源的名称
最后但并非最不重要的一点是,我使用API方法的名称和为其定义的路由引用\u Layout.cshtml中的CSS,如下所示:
<link rel="stylesheet" href="~/api/SampleAPI/cssMyViewComponent" />
好吧,到目前为止,对我来说,这个.NET核心的东西让我的生活变得复杂,而不是变得简单。不管怎样,我还是设法得到了