Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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 mvc 项目子目录作为静态文件的根目录_Asp.net Mvc_Routes - Fatal编程技术网

Asp.net mvc 项目子目录作为静态文件的根目录

Asp.net mvc 项目子目录作为静态文件的根目录,asp.net-mvc,routes,Asp.net Mvc,Routes,我是ASP.NET MVC新手,正在使用Visual Studio 2013向导创建一个web应用程序。它创建了几个用于提供静态文件的文件夹:内容、脚本等 其他语言(如TurboGears)的框架只有一个用于静态内容的显式目录,消除了为页面的源代码提供服务而不是处理页面的风险,这是PHP站点的典型配置错误 然而,ASP.NET很乐意提供应用程序根目录中的任何内容,例如。http://localhost:1740/Project_Readme.html 只要它有正确的分机。只有视图文件夹受Web.

我是ASP.NET MVC新手,正在使用Visual Studio 2013向导创建一个web应用程序。它创建了几个用于提供静态文件的文件夹:内容、脚本等

其他语言(如TurboGears)的框架只有一个用于静态内容的显式目录,消除了为页面的源代码提供服务而不是处理页面的风险,这是PHP站点的典型配置错误

然而,ASP.NET很乐意提供应用程序根目录中的任何内容,例如。http://localhost:1740/Project_Readme.html 只要它有正确的分机。只有视图文件夹受Web.config保护

如何将应用程序配置为在静态文件中使用项目根目录以外的另一个目录。例如,如果文件favicon.ico被放入子目录内容中,那么它应该可以作为http://localhost:1740/favicon.ico,但除非由控制器返回,否则在内容目录之外没有任何内容

在此目录中不应执行任何操作,也就是说,如果将*.cshtml文件放入此目录中,则源代码中的文件内容应以text/plain格式交付


最后一个应用程序将在Linux上使用mod_mono运行。

我找到的最佳解决方案是忽略asp.net正常方式,编写一种新方式

        public override void Init()
        {
            BeginRequest -= OnBeginRequest;
            BeginRequest += OnBeginRequest;
        }


        protected void OnBeginRequest(object sender, EventArgs e)
        {
            if (Request.Url.AbsolutePath.StartsWith("/endPoint"))
            {
                Context.RemapHandler(endPoint);
            }
            else
            {
                Context.RemapHandler(staticHandler);
            }
        }
让端点和staticHandler实现IHttpHandler 它可以工作,但每个静态文件都会通过c移动,因此可能会有一个性能更好的解决方案更新:

建议的解决方案仅适用于Owin。要使其在MVC应用程序中工作,您必须仅使用asp.net核心或asp.net 5的asp.net MVC 6部分。但是,有了Web API,您也可以使用旧版本。要设置应用程序,请使用以下步骤:

使用visual studio模板创建空项目不要选择Web API或MVC

将以下Nuget包添加到项目中:

Microsoft.AspNet.WebApi

Microsoft.AspNet.WebApi.Owin

Microsoft.Owin.Host.SystemWeb

Microsoft.Owin.StaticFiles

添加一个Startup.cs文件并用以下内容装饰名称空间

[组件:OwinStartuptypeofStartup]

将以下代码添加到Stratup.cs类

public void Configuration(IAppBuilder app)
{
    var config = new HttpConfiguration();
    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new {id = RouteParameter.Optional}
        );
    //Configure the file/ static file serving middleware
    var physicalFileSystem = new PhysicalFileSystem(@".\client");
    var fileServerOptions = new FileServerOptions
    {
        EnableDefaultFiles = true,
        RequestPath = PathString.Empty,
        FileSystem = physicalFileSystem
    };

    fileServerOptions.DefaultFilesOptions.DefaultFileNames = new[] {"index.html"};
    fileServerOptions.StaticFileOptions.ServeUnknownFileTypes = true;
    fileServerOptions.StaticFileOptions.FileSystem = physicalFileSystem;
    app.UseFileServer(fileServerOptions);
    app.UseWebApi(config);
}
这应该很神奇。现在,您可以在IIS中托管应用程序。IIS将仅为客户端文件夹中的静态资产提供服务。添加服务器文件夹并添加控制器。 Microsoft.Owin.Host.SystemWeb有助于在IIS中托管Owin应用程序。文件服务选项帮助IIS仅从客户端文件夹服务静态文件

如果你有任何问题,请告诉我

根据您的问题,您想要实现的项目结构应该如下所示

基本上你只有两个文件夹,客户端和服务器。静态文件仅从客户端文件夹提供。无法访问服务器文件夹。如果这是您所需要的,那么可以使用Owin Self Host和静态文件服务中间件轻松实现

自主机不依赖于IIS。但是,如果您计划在Linux上托管此应用程序,则可以使用Asp.NET CORE 1.0。稍后,如果您决定在windows内部的IIS上托管应用程序,则可以通过添加Microsot.Owin.host.SystemWeb nuget包轻松实现

关于这个话题有很多很棒的博客帖子。这是他们中的一个。下面是在Asp.NET核心中实现相同功能的方法

我希望这能解决您的问题,如果您有任何问题,请告诉我

谢谢,,
Soma.

我想这可能会对您有所帮助:不幸的是,该解决方案仅在请求以Public开头时有效,我需要除单个端点之外的所有东西感谢您的关注。一旦我再次使用ASP.NET进行操作,我将尝试此方法。这是一个性能不佳的解决方案,我希望有人能向我展示一个更好的解决方案。你正确理解了问题,但我不知道如何操作,我使用的是windows。从你的链接中,我得到了var config=newhttpconfiguration;config.Routes.MapHttpRoute名称:DefaultApi,routeTemplate:api/{controller}/{id},默认值:new{id=RouteParameter.Optional};app.UseWebApiconfig;app.UseFileServertrue;在哪里设置文件路径和服务器路径?我如何告诉iis从哪里提供服务?它是否比代码更有效?加上奥文·莱伊,谢谢你的赏金。如果此解决方案回答了您的问题,请将我的答案标记为已接受。谢谢你。非常感谢你的帮助,我没有提出那个问题,所以我不能接受答案。谢谢你的回复,如果你有任何问题,请告诉我。非常好!我还必须对web.config进行一个小的更改,如本回答中所述