【问题标题】:Deploy ASP.Net core 1 app on IIS (404 error)在 IIS 上部署 ASP.Net core 1 应用程序(404 错误)
【发布时间】:2016-02-22 09:56:21
【问题描述】:

我正在努力让我的 ASP.Net core 1 (asp.net 5 / MVC 6) 应用程序在我的网络服务器上的 IIS 中运行。我已经按照指南在服务器上完成了以下操作

  • 通过 get.asp.net 安装 ASP.Net 5
  • 安装 HttpPlatformHandler 1.2

我检查了我可以在服务器上运行 dnx 并且编译位是 64 位,并且应用程序池是“无托管代码”并且以 64 位运行。

我可以通过运行 web.cmd 并导航到 http://localhost:5000(或任何端口)在网络服务器上运行应用程序,但是当我尝试将应用程序设置为默认网站中的应用程序并浏览到它时(例如 @ 987654322@) 我收到 404 错误。我检查了物理路径是否指向 /MyMVC6App/wwwroot。我还检查了 webserver/handlers 部分是否已解锁。

我还创建了一个普通的 ASP.Net 5/Core 1 应用程序,并在 2 个不同的服务器上得到相同的 404 错误!

这是我的配置方法:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();

            app.UseApplicationInsightsRequestTelemetry();

            if (env.IsDevelopment())
            {
                app.UseBrowserLink();
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseIISPlatformHandler();

            app.UseApplicationInsightsExceptionTelemetry();

            app.UseStaticFiles();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }

有什么想法吗?

【问题讨论】:

  • 我还刚刚发现,如果我创建一个新网站(不是 Web 应用程序)并将其作为唯一的 Web 应用程序托管,我可以运行该应用程序。但是,由于我有其他 Web 应用程序(MVC 5 及更低版本),我不能这样做,因为我需要在不同的端口上运行新网站。
  • 您能否确认当您尝试访问该 URL 时,IIS AppPool 是否启动了 dnx.exe?如果不是,则意味着问题出在 web.config 文件中的 HttpPlatform 配置上。 web.config 中的路径使用我认为的相对路径。如果它正在启动 dnx.exe 并且在您应该在 httpPlatform 配置中启用 stdoutLogEnabled="true" 以找出原因后很快就死了。
  • 信息:Microsoft.Extensions.DependencyInjection.DataProtectionServices[0] 用户配置文件可用。使用 'C:\Windows\system32\config\systemprofile\AppData\Local\ASP.NET\DataProtection-Keys' 作为密钥存储库和 Windows DPAPI 来加密静态密钥。托管环境:生产现在正在监听:localhost:8465 应用程序已启动。按 Ctrl+C 关闭。 info: Microsoft.AspNet.Hosting.Internal.HostingEngine[1] 请求开始 HTTP/1.1 GET localhost/Extranet info: Microsoft.AspNet.Hosting.Internal.HostingEngine[2] 请求在 0.0656 毫秒内完成 404
  • 您也可以粘贴您的配置方法吗?我会看看我是否可以在我的最后重现......刚刚注意到你正在将它作为一个应用程序在 IIS 上运行......他们说这是一个已知的事情......但是添加你的 MVC6app 作为路由的基础......就像/MVC6APP/{controller=Home}/...
  • Holy Moly - 如果我将路由模板更改为 Extranet/{controller=Home}/{action=Index}/{id?}"); 它可以工作 - css 搞砸了,但它可以工作 -怎么会!?

标签: iis asp.net-core-mvc


【解决方案1】:

如果您的静态文件托管在 ASPNET Core 应用程序之外,解决此问题的最简单方法是将 IIS 应用程序名称添加为 MVC 中路由的基础。

另一种方法是添加一个简单的中间件类来去除 IIS 应用程序名称,并使请求对于它下面的任何模块看起来都是透明的。我还没有测试过下面的代码,但是:

using System.Threading.Tasks;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;

namespace MyMVC6App
{
    // You may need to install the Microsoft.AspNet.Http.Abstractions package into your project
    public class RemoveIISAppNameMiddleware
    {
        private readonly RequestDelegate _next;

        public RemoveIISAppNameMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public Task Invoke(HttpContext httpContext)
        {
            var newRequestPath = new PathString();
            var requestPathToIgnore = new PathString("/MyMVC6App");

            if (httpContext.Request.Path.StartsWithSegments(requestPathToIgnore))
            {
                httpContext.Request.Path.StartsWithSegments(requestPathToIgnore, out newRequestPath);
                httpContext.Request.Path = newRequestPath;
            }
            return _next(httpContext);
        }
    }

    // Extension method used to add the middleware to the HTTP request pipeline.
    public static class RemoveIISAppNameMiddlewareExtensions
    {
        public static IApplicationBuilder UseRemoveIISAppName(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<RemoveIISAppNameMiddleware>();
        }
    }
}

然后在app.UseIISPlatformHandler() 之后的配置方法中,您将调用app.UseRemoveIISAppName()。在这种情况下,您不需要在 MVC 路由中添加任何额外路径。

【讨论】:

  • 我已经尝试了上述方法以及damirscorner.com/blog/posts/… 中概述的方法,两者都使我能够在页面上获得点击,但是所有的 css 和脚本链接都不再起作用。我正在尝试使用 Fiddler 来解决它并找到一个有效的网址,但我目前没有任何运气。
猜你喜欢
  • 2020-05-28
  • 2019-10-09
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
相关资源
最近更新 更多