7

Я хочу иметь возможность взять на себя ответ 404 от веб-api (iis), когда ресурс не существует.Web API 2.2 возвращает пользовательский 404, когда ресурс (url) не найден

Я сделал свое исследование и наткнулся только one solution, которые сделали эту работу, но я не уверен, как «безопасный» это с «routeTemplate» просто {* URL}

Этот пост является своего рода в попросите помощи и объяснений.

Мое приложение использует MVC и WebAPI ... будет ли этот шаблон влиять на MVC? Есть ли способ добавить «api» с {* url} в шаблоне? (Чтобы убедиться, что просит только «.../апи/...» получить пострадавших)

config.Routes.MapHttpRoute("Error404", "{*url}", new { controller = "Error", action = "Handle404" }); 

Кто-нибудь сталкивался чище способ сделать это и обработку 404 в Web API?

EDIT 1

Приведенный выше код Влияет мои маршруты MVC. Как я могу добавить «api» в «{* url}»? ... если пробовал много разных способов и не кубиками.

+0

Вы пытались «{api/* url}" или "{api * url}" и т.д ..? –

+0

У меня была та же проблема, сайт с использованием как web api, так и MVC. Следуя инструкциям в статье, с которой вы связались, будет нарушена ваша маршрутизация MVC. Решение состоит в том, чтобы изменить шаблон маршрута на «api/{* url} –

ответ

5

Был такой же вопрос. После некоторых исследований и испытаний и ошибок я смог найти рабочее решение.

Я пошел с решением RoutePrefix, и я попытался реализовать что-то похожее на то, как используются контроллеры MVC HandleUnknownAction в базовом контроллере.

С помощью этого поста: .NET WebAPI Attribute Routing and inheritance, чтобы обеспечить наследование маршрута, я создал базовый контроллер для моего веб-API, с HandleUnknownAction способом, как это:

public abstract class WebApiControllerBase : ApiController { 

    [Route("{*actionName}")] 
    [AcceptVerbs("GET", "POST", "PUT", "DELETE")]//Include what ever methods you want to handle 
    [AllowAnonymous]//So I can use it on authenticated controllers 
    [ApiExplorerSettings(IgnoreApi = true)]//To hide this method from helpers 
    public virtual HttpResponseMessage HandleUnknownAction(string actionName) { 
     var status = HttpStatusCode.NotFound; 
     //This is custom code to create my response content 
     //.... 
     var message = status.ToString().FormatCamelCase(); 
     var content = DependencyService 
      .Get<IResponseEnvelopeFactory>() 
      .CreateWithOnlyMetadata(status, message); 
     //.... 
     return Request.CreateResponse(status, content); 
    } 
} 

Если вы не хотите спуститесь по пути наследования, вы всегда можете поместить метод непосредственно в контроллер, на который вы хотите применить функциональность.

Это позволяет использовать префиксы маршрута, которые обрабатывают пользовательские не найденные сообщения, относящиеся к конкретным контроллерам, поскольку у меня есть как обратные, так и публичные публичные API.

Если URL-адрес не применяется к ApiContoller, контроллер ошибок по умолчанию будет обрабатывать не найденные, как обычно.

Смежные вопросы