我有一个使用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一样工作。任何想法或建议将不胜感激。
答案 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将寻找路径/等等/等等。如果它存在,它将返回一些东西。如果不是,它将被您在顶部的重定向中间件拾取。这将导致重定向到/并且整个过程将再次开始。您不需要任何虚拟目录来实现此目的,因此您可以删除它们。