Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core asp.net Core 1.1外部程序集中的嵌入式样式表_Asp.net Core_Asp.net Core Mvc_Embedded Resource - Fatal编程技术网

Asp.net core asp.net Core 1.1外部程序集中的嵌入式样式表

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放在其中

我正在使用VS.2017社区版15.2更新版(26430.12)在我的解决方案中,我有一个主ASP.NET Core 1.1web应用程序和一个单独的程序集,它是一个.NET Core类库,我对其进行了装配,使其成为web SDK类库,并从中向主web应用程序提供视图组件。那很好

然而,我刚刚添加了两个局部视图(稍后可能是视图组件),但这两个视图尤其需要包含样式表(CSS)文件。因为我希望所有东西都像可视化组件一样是自包含的,所以我创建了一个wwwroot\css文件夹,并将我的css放在其中,使其成为嵌入式资源

问题是。。。。在我的主web应用程序中,如果样式表嵌入到外部程序集中,如何在ASP.NET Core布局文件中对该样式表进行流式处理?

基于 ,我认为理论上,您可以向静态文件中间件添加一个嵌入式文件提供程序,如下所示:

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的视图组件嵌入的外部程序集的完整命名空间具有命名空间,我在那里定义了我的组件及其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核心的东西让我的生活变得复杂,而不是变得简单。不管怎样,我还是设法得到了