Как перехватить 404 Not Found с помощью конвейера OWIN

У меня есть еще один вопрос, связанный с Web-API и OWIN. Я «играю» с этим, пытаясь узнать об этом, и я хотел посмотреть, смогу ли я перехватить 404 на «обратном пути» из веб-API.

Итак, у меня есть следующее в моем Startup..

app.Use(async (environment, next) =>
      {       
        Debug.WriteLine(environment.Request.Uri);
        await next();   
        Debug.WriteLine(environment.Response.StatusCode);
      });

  HttpConfiguration config = new HttpConfiguration();
  WebApiConfig.Register(config);
  app.UseWebApi(config);

Затем я выполняю GET (в браузере), используя недопустимый URI, чтобы получить результат 404. Я ожидал увидеть это как код состояния, записанный в Debug.WriteLine(environment.Response.StatusCode)

Однако все, что я вижу (в окне вывода dev studio, когда я запускаю IIS Express), это

http://localhost:55905/myresource
http://localhost:55905/myresource
200
200

Я действительно ожидал увидеть 404 там.

Кто-нибудь знает, почему мы не видим возвращения 404?

Я просмотрел ответ и нигде его не вижу.

Заранее благодарю за любую помощь!


person peterc    schedule 25.04.2014    source источник
comment
401 = Неавторизованный. 404 = Не найдено.   -  person Damien_The_Unbeliever    schedule 25.04.2014
comment
ДОХ! Да, у меня была ошибка в названии. Я имел в виду 404. Заголовок исправил, но вопрос остался.   -  person peterc    schedule 25.04.2014
comment
@peterc Вы когда-нибудь понимали, что здесь происходит? Я сталкиваюсь с аналогичной проблемой.   -  person Joshua Barron    schedule 18.09.2014
comment
@ Джошуа Бэррон Нет, я так и не узнал об этом. Кое-что, что я все еще хотел бы знать, должен будет вернуться к этому в ближайшее время. Если ты узнаешь первым, мне будет очень интересно.   -  person peterc    schedule 23.09.2014


Ответы (1)


Является ли /myresource допустимым маршрутом webapi? Я думаю (но я не уверен), что ваш запрос обрабатывается IIS напрямую, игнорируя owin-конвейер. Но я не знаю, почему он отвечает 200. Вы можете легко проверить это. Предполагая ваш код и следующую конфигурацию:

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        config.Routes.MapHttpRoute(
            name: "API Default",
            routeTemplate: "api/{controller}/{id}",
            defaults: new {id = RouteParameter.Optional}
            );
    }
}

И немного изменил ваш класс Startup:

app.Use(async (environment, next) => {
    Debug.WriteLine(environment.Request.Uri);

    environment.Response.OnSendingHeaders(_ => {
        var resp = ((IOwinResponse) _);
        Debug.WriteLine("Headers are send!: {0}", resp.StatusCode);
        resp.Headers.Add("X-MyTag", new[] {"Nice value!"});

    }, environment.Response);
    await next();
    Debug.WriteLine(environment.Response.StatusCode);
});

Пример контроллера:

public class ValuesController : ApiController {
    // GET api/<controller>
    public IEnumerable<string> Get() {
        return new string[] { "value1", "value2" };
    }
}

Теперь конвейер OWIN должен возвращать в КАЖДОМ запросе настраиваемый заголовок X-MyTag. Я использую Fiddler для проверки моего запроса.

На запрос к http://localhost:13543/ отвечает без моего заголовка. Таким образом, он не обслуживается собственным конвейером. С другой стороны, запрос к http://localhost:13543/api/Values отвечает 200 и моим пользовательским заголовком.

(Недействительный) запрос к http://localhost:13543/api/Values1 отвечает 404, включая мой пользовательский заголовок, И вы можете увидеть этот 404 в своей выходной консоли.

person Stefan Ossendorf    schedule 01.01.2015