在IIS上部署ASP.Net Core 1应用程序(404错误)

3

我很难让我的ASP.Net core 1(asp.net 5 / MVC 6)应用程序在我的web服务器上运行。我已经按照指南在服务器上做了以下操作:

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

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

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

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

这是我的configure方法:

 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?}");
            });
        }

有什么想法吗?

1
我刚刚发现,如果我创建一个新的网站(而不是Web应用程序)并将其作为唯一的Web应用程序托管,我也可以运行该应用程序。但是,由于我有其他Web应用程序(MVC 5及以下版本),所以我无法这样做,因为我需要在不同的端口上运行新网站。 - Calanus
信息:Microsoft.Extensions.DependencyInjection.DataProtectionServices[0] 用户配置文件可用。使用“C:\Windows\system32\config\systemprofile\AppData\Local\ASP.NET\DataProtection-Keys”作为密钥存储库,并使用Windows DPAPI加密静止的密钥。 托管环境:生产 现在正在侦听:http://localhost:8465 应用程序已启动。按Ctrl+C关闭。 信息:Microsoft.AspNet.Hosting.Internal.HostingEngine[1] 请求开始 HTTP/1.1 GET http://localhost/Extranet
信息:Microsoft.AspNet.Hosting.Internal.HostingEngine[2] 请求完成于0.0656毫秒 404
- Calanus
aspnet core 明显无法找到 extranet 控制器... 你是否启用了 app.usedeveloperexceptionpage 和 app.usestatuscodepage??? - Muqeet Khan
1
你能把你的配置方法也复制粘贴一下吗?我想看看我能否在我的端上重现这个问题...我刚刚注意到你是在IIS上运行这个应用程序...他们说这是一个已知的问题...但是将你的MVC6app添加为路由的基础...像/MVC6APP/{controller=Home}/... - Muqeet Khan
1
天啊 - 如果我将我的路由模板更改为Extranet/{controller=Home}/{action=Index}/{id?}"); 它可以工作 - css有点问题但它可以工作 - 为什么呢!? - Calanus
显示剩余4条评论
1个回答

1
最简单的解决方法是在MVC中将IIS应用程序名称添加为路由的基础,如果您的静态文件托管在ASPNET Core应用程序之外。
另一种方法是添加一个简单的中间件类来剥离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路由中添加任何额外的路径。

我已经尝试了上述方法以及http://www.damirscorner.com/blog/posts/20160214-DeployingAspNetCoreRc1ApplicationToIis.html中概述的方法。两种方法都可以让我在页面上获得点击,但是所有的CSS和脚本链接都不再起作用。我正在尝试使用Fiddler来解决这个问题,并找到一个有效的URL,但目前还没有任何进展。 - Calanus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接