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

时间:2016-02-22 09:56:21

标签: iis asp.net-core-mvc

我很难在我的网络服务器上运行我的ASP.Net核心1(asp.net 5 / MVC 6)应用程序。我已按照指南操作并在服务器上完成以下操作

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

我已经检查过我可以在服务器上运行dnx并且编译的位是64位,并且应用程序池是“No Managed Code”并且运行为64位。

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

我还创建了一个vanilla 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?}");
            });
        }

有什么想法吗?

1 个答案:

答案 0 :(得分: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路由中有任何其他路径。