Настройка маршрутизации в ASP.net Web API для внешнего интерфейса Angular - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь настроить мой текущий веб-API для обслуживания внешнего интерфейса приложения 6.

Мой угловой проект находится в каталоге 'app' в Web API.

Я могу нормально перейти на базовую страницу, и вся внешняя маршрутизация работает нормально.

Моя разработка продолжается: https://test2.localhost.com/app/

Мне нужно было установить базовое местоположение в index.html на base href = "/ app /" .

Теперь моя проблема сводится к прямой навигации по под URL-адресам приложения. Например:

https://test2.localhost.com/app/information/planets

Я получаю 404, что наводит меня на мысль, что проблема заключается в маршрутизации Web API.

Если бы я должен был запустить угловое приложение в https://test2.localhost.com/app/, я мог бы перейти к URL, но не из холодного старта в браузере.

Я перепробовал несколько правил перезаписи в файле web.config, но, похоже, все не работает и не дает перейти к https://test2.localhost.com/app

Веб-API работает на IIS.

При запуске веб-интерфейса на узле J маршрутизация работает нормально, и я могу перейти ко всем под URL-адресам с холодного запуска.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Я понял, не уверен, что это лучший способ, но он работает.

Я создал контроллер с именем FEController (FrontEndController).

public ActionResult Index()
{
  return File(Server.MapPath("/app/") + "index.html", "text/html");
}

Затем добавили карту маршрута в RouteConfig.cs

routes.MapRoute(
   "Angular",
   "{app}/{*pathInfo}",
   new { controller = "FE", action = "Index", id = UrlParameter.Optional }
);

routes.MapRoute(
   name: "Default",
   url: "api/{controller}/{action}/{id}",
   defaults: new { controller = "HelpMain", action = "Index", id = UrlParameter.Optional }
);

Проверено и подтверждено работоспособность.

0 голосов
/ 13 сентября 2018

Если у вас также есть маршруты MVC, попробуйте это для вашего route.config:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            constraints: new
            {
                // Add all routes we need MVC to handle here
                serverRoute = new ServerRouteConstraint(url =>
                {
                    return url.PathAndQuery.StartsWith("/qbo",
                        StringComparison.InvariantCultureIgnoreCase);
                })
            });

        // This is a catch-all for when no other routes matched. Let the Angular 2+ router take care of it
        routes.MapRoute(
            name: "angular",
            url: "{*url}",
            defaults: new { controller = "Home", action = "Index" } // The view that bootstraps Angular 2+
        );
    }

Вот класс ограничений маршрута:

using System;
using System.Web;
using System.Web.Routing;

namespace Web
{
public class ServerRouteConstraint : IRouteConstraint
{
    private readonly Func<Uri, bool> _predicate;

    public ServerRouteConstraint(Func<Uri, bool> predicate)
    {
        this._predicate = predicate;
    }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName,
        RouteValueDictionary values, RouteDirection routeDirection)
    {
        return this._predicate(httpContext.Request.Url);
    }
}
}

Я использовал это длядолгое время не знал, на какой блог я мог быть вдохновлен.

...