2017-02-01 5 views
1

У меня есть API-контроллер в приложении ASP.NET Core следующим образом.Неверный URL API в ASP.NET Core

[Route("api")] 
public class UserController : Controller 
{ 
    [HttpGet("{userName}/product_info")] 
    public IActionResult GetProductInfo(string userName) 
    { 
     List<ProductInfo> productInfos = _repo.GetProductInfoByUserName(userName); 
     if (productInfos.Count > 0) 
      return Ok(productInfos); 
     else 
      return BadRequest("Unable to process requrest"); 
    } 
} 

Я могу позвонить выше API, используя /api/{username}/product_info. Я использую UseStatusCodePagesWithRedirects() для перенаправления на страницу 404, когда пользователь вводит неправильный URL-адрес. Проблема здесь в том, что когда я использую неправильный URL-адрес API, такой как /api/{username}/product_o. Он перенаправляет на страницу 404 и возвращает код состояния 200. Я использую этот API с angular.js. Поскольку API возвращает 404 страницы на неверный URL с кодом состояния 200, функция ошибки then метода $http никогда не вызывается и в response.data Я получаю HTML-код 404 страницы. Как вернуть код статуса 404, когда вызывается неправильный URL API и возвращает нормальную страницу 404, когда вызывается неправильный URL-адрес NON API? Ниже приведен снимок экрана о том, что я получаю, когда я вызываю неправильный URL API. enter image description here

основа @Daboul предложения и решения на this link Добавления следующей части в configure методе startup.cs работ.

Func<HttpContext, bool> isApiRequest = (HttpContext context) => context.Request.Path.ToString().Contains("/api/"); 
app.UseWhen(context => !isApiRequest(context), appBuilder => 
{ 
    appBuilder.UseStatusCodePagesWithRedirects("~/Error/{0}"); 
}); 

ответ

1

Я считаю, что с помощью промежуточное программное как UseStatusCodePages() или UseStatusCodePagesWithRedirects(), вы решили на самом деле вернуть правильный HTML-страницу, содержащую код ошибки (который требуется отправить в браузере код 200) вместо возвращая код сам по себе. Обычно это считается хорошей практикой с точки зрения безопасности. То, что вы испытываете, кажется мне логичным. Возможно, я не уверен, что это поможет в вашем случае, что вы можете сделать, это ограничить использование UseStatusCodePagesWithRedirects() ко всем контроллерам, кроме api, используя UseWhen(), чтобы любой неверный URL-адрес на этом конкретном «/ api/"контроллер все равно вернет 404? Или проанализируйте ответ в своем угловом выражении, чтобы обнаружить, произошла ли какая-либо ошибка.

+0

Я новичок в angular.js, поэтому я не могу много сделать на стороне javascript. На стороне ASP.NET какое промежуточное ПО следует использовать, чтобы исключить использование контроллера API из StatusCodePages? Эта проблема также возникает, когда я добавляю атрибут Authorize для контроллера API. После добавления атрибута 'Authorize', когда я пытаюсь получить доступ к API без входа, он возвращает страницу входа с кодом состояния 200. Из-за этого мне пришлось удалить атрибут «Авторизовать». –

+0

UseWhen() выполнит эту работу. Пример можно найти здесь, например: http://stackoverflow.com/questions/37841270/branching-asp-net-core-pipeline-authentication Использование UseWhen() в соединении с условием на URL 'context.Request.Path .StartsWithSegments ("/ API /") ' – Daboul

+0

В вашей версии Update1' app.UseWhen (context =>! IsApiRequest (context), appBuilder => { app.UseStatusCodePagesWithRedirects ("~/Error/{0}"); }); 'должно быть' app.UseWhen (context =>! IsApiRequest (контекст), appBuilder => { appBuilder.UseStatusCodePagesWithRedirects ("~/Error/{0}"); }); 'switch app for AppBuilder. – Daboul