Действие URI для Web API не работает, когда приложение публикуется в IIS как веб-приложение на веб-сайте по умолчанию - PullRequest
1 голос
/ 06 апреля 2020

Я добавил Web API 2 в существующее MVC 5 веб-приложение. Я использую методы этого веб-API для возврата JSON данных в MVC представления.

Это пример вызова ajax внутри представления:

$.getJSON('@Url.RouteUrl("DefaultApi"
    , new { httproute = true, controller = "Data", action = "GetMyData" })'
    , function (data) {
        ... do sth with returned json data here ...
    });

это код, сгенерированный на клиенте:

$.getJSON("/api/Data/GetMyData", function (data) { ...

и вот так выглядит файл WebApiConfig.cs:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

Все отлично работает, когда я отлаживаю в Visual Studio. Но когда я развертываю приложение в IIS как приложение в разделе «Веб-сайт по умолчанию», все ссылки на методы действий Web API нарушаются.

Другими словами $.getJSON("/api/Data/GetMyData", function (data) { ... отлично работает, когда я запускаю сеанс отладки из Visual Studio, но возвращает ошибку 404 при развертывании приложения в IIS.

Когда я набираю

http://localhost/myAppVirtualPath/api/data/GetMyData

непосредственно в адресной строке браузера, я получаю результаты, как и ожидалось.

Кажется, что виртуальный путь приложения должен быть добавлен перед '/ api' в URI. Но @Url.RouteUrl("DefaultApi" не может этого сделать. Есть ли что-то очевидное, чего мне здесь не хватает? Я думаю, что есть, но что это может быть?

...