Как заставить все запросы в проекте ASP.NET 5 MVC перенаправить на root "/"? - программирование

Как заставить все запросы в проекте ASP.NET 5 MVC перенаправить на root "/"?

Эта статья Стивена Вальтера рассказывает о перенаправлении всех запросов в проекте MVC путем изменения раздела web.config system.webServer/rewrite.

http://stephenwalther.com/archive/2015/01/16/asp-net-5-and-angularjs-part-3-adding-client-routing

Однако, кажется, неправильно пересобирать XML файл web.config в проект ASP.NET 5.

Есть ли другой способ сделать это в ASP.NET 5? Может быть, через новый config.json?

4b9b3361

Ответ 1

В вашем методе Startup Configure, где app является вашим IApplicationBuilder:

app.Run(context =>
{
    context.Response.Redirect("/");
    return Task.FromResult<object>(null);
});

Это отправит все необработанные запросы в корень вашего приложения. Поместите это последнее, после любых UseStaticFiles() или других регистраций промежуточного программного обеспечения.

Обратите внимание, что это не будет регистрировать регистрацию выше этого; если на вашем сервере есть другие маршруты (например, действия контроллера и т.д.), они не будут захвачены. Это должно хорошо работать с дополнительным преимуществом, которое вам не нужно исключать шаблоны, например, в этом примере.

В качестве альтернативы...

Если вы делаете это для приложения с одной страницей, вы, вероятно, хотите разрешить глубокую привязку для своих пользователей. Для этого я использую простую маршрутизацию атрибутов:

[Route("", Order = -1)]
[Route("{*pathInfo}", Order = 1000)]
public async Task<IActionResult> Index(string pathInfo = "", CancellationToken cancellationToken = default(CancellationToken))
{    
    return View("UiView");
}

Это будет отображать запросы по умолчанию (/) с приоритетом, одновременно сопоставляя все другие запросы (позволяющие упорядочивать по умолчанию и т.д.) и ваш "UiView".

Если вы не хотите использовать маршрутизацию атрибутов, используйте метод, как указано выше, со следующим отображением маршрутов:

// Before all your routes
routeBuilder.MapRoute(
    "Root",
    "",
    defaults: new { controller = "Home", action = "Index" });

// Your routes here

// After all your routes
routeBuilder.MapRoute(
    "DeepLink",
    "{*pathInfo}",
    defaults: new { controller = "Home", action = "Index" });

Ответ 2

Нашел этот очень хороший ответ на SO: fooobar.com/questions/453296/...

Контекст:

У меня есть приложение SPA, а ASP.NET Core обслуживает некоторые REST API + 'wwwroot/index.html'.

Я обрабатываю свои маршруты внутри приложения SPA (на стороне клиента), и он не работает, когда пользователь обновляет браузер с заданным маршрутом.

Пример: обновление браузера с URL http://localhost:5000/Account дает ошибку 404, потому что на сервере нет файла 'wwwroot/Account/index.html', хотя это допустимый маршрут внутри клиентского приложения.

Решение:

public void Configure(IApplicationBuilder app)
{
    app.UseMvc();

    app.UseStatusCodePagesWithReExecute("/");

    app.UseDefaultFiles();
    app.UseStaticFiles();
}

Обратите внимание, что порядок важен.

= > это означает, что если маршрут не соответствует файлу на сервере или чему-либо известному (например, REST API), сервер обслуживает "/" ( "wwwroot/index.html" ), сохраняя неповрежденный URL.

Протестировано с помощью приложения React/React Router и ASP.NET MVC Core 1.1

Ответ 3

Я развертываю приложение AngularJS на Azure с vnext. Благодаря Мэтту я смог сделать этот фрагмент:

app.Run(context =>
            {
                if(context.Request.Path.Value != "/api") context.Response.Redirect("/");
                return Task.FromResult<object>(null);
            }
        );

Он перенаправляет все в приложение Angular, за исключением моих вызовов RIP api.

Ответ 4

На основании ответа @Matt DeKrey и с помощью одного из разработчиков здесь, в моей компании, вот как я получил ASP.NET Core 1 MVC для маршрутизации всех запросов на один вид. Идеально подходит для моего приложения Angular2 с глубокой привязкой.

HomeController.cs

Внутри public class HomeController : Controller

[Route("", Order = -1)]
[Route("{*pathInfo}", Order = 1000)]
public async Task<IActionResult> Index(string pathInfo = ""))
{    
    return View("View");
}

Startup.cs

Внутри public void Configure

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