Azure上的ASP.net核心服务器端重定向问题

时间:2018-03-07 18:38:45

标签: reactjs azure asp.net-core asp.net-core-2.0 react-router-v4

我有一个使用react-router构建的react.js应用程序,为数据调用ASP.NET核心2.0的restful服务。我希望任何服务器端404错误只是路由到" /"。我的创业公司有app.UseStatusCodePagesWithReExecute("/")

在我的localhost(iis express)中放置显式路径时,当输入非法路径时(如预期的那样),它会重定向到root,并且如果输入了合法路径,则实际显示相应的页面。

但是,当在Azure上部署相同的应用程序时,将非法路径或合法路径置于root之外会为我提供此页面:

The resource you are looking for has been removed, had its name changed, 
or is temporarily unavailable.

我不确定是否需要额外的Azure配置才能使其像localhost一样工作。任何想法或建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

我刚刚部署了这个,我没有遇到任何问题,所以我假设你的中间件顺序错误,应该是这样的。验证是否按此顺序

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseStatusCodePagesWithRedirects("/");
        app.UseDefaultFiles(); //also add this

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles();

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

这应该是任何中间件之前的第一个。只是旁注,这个中间件不会导致浏览器重定向,它只是重写路径。因此,在您的浏览器中,您可以访问/ sfsdf / sdfsdfsdgfs。这可能是一个问题,因为您使用的是React。 / sfsdf / sdfsdfsdgfs将被react-router接收,如果你没有办法处理它,将无处可去。如果要导致重定向,请替换app.UseStatusCodePagesWithReExecute(" /")并使用

app.UseStatusCodePagesWithRedirects("/");

同样,这应该是您添加的第一个中间件,并且可以更好地使用您的react-router。

在重定向中间件之后添加此中间件。

 app.UseDefaultFiles();

所有这些中间件的作用是它在您的站点/ wwwroot文件夹中查找index.html(它不必是index.html,它也尝试匹配其他文件),并在每次请求/时提供服务。所以在site / wwwroot中有一个index.html页面,它可以帮助你做出反应。你可能已经有了这个。

您不需要任何虚拟目录指向/ api和一个响应应用程序。所以你可以删除它们

react应用程序将存在于您站点/ wwwroot中的index.html文件中 您的api将存在于mvc控制器中。我知道你已经设置好了。

您不需要任何虚拟目录的原因是ASP.Net核心将为您处理所有这些。当你向/提出请求时 它会被

选中
app.UseDefaultFiles();

这将在内部重写路径为/index.html

这将由静态中间件接收,并将返回index.html页面,该页面保存您的react应用程序并结束请求。

现在说你向/ blah / blah提出请求。这将跳过前两个中间件并点击MVC。 MVC将寻找路径/等等/等等。如果它存在,它将返回一些东西。如果不是,它将被您在顶部的重定向中间件拾取。这将导致重定向到/并且整个过程将再次开始。您不需要任何虚拟目录来实现此目的,因此您可以删除它们。