2015-09-21 2 views
3

Я разработал некоторое промежуточное ПО OWIN для добавления настраиваемого заголовка в ответ. Однако в моих тестах интеграции (в которых используется OWIN TestServer), я не вижу пользовательский заголовок в объекте ответа.Пользовательский заголовок ответа не отправлен

Я замечаю, что я вижу заголовок местоположения, который я заполняю для запросов POST.

Я также замечаю, что заголовок появляется, когда я делаю настоящие запросы к службе.

Кто-нибудь знает, почему я не вижу пользовательский заголовок в случае TestServer? Есть ли настройки, которые мне нужно сделать, чтобы это разрешить?

Вот Owin промежуточного слоя:

private async Task CalculateTimeToProcess(IOwinContext context) 
{ 
    var sw = new Stopwatch(); 
    sw.Start(); 
    await Next.Invoke(context); 
    sw.Stop(); 
    var response = context.Response; 
    response.Headers.Add("x-timetoprocessmilliseconds", 
     new[] { sw.ElapsedMilliseconds.ToString(CultureInfo.InvariantCulture) }); 
} 

Это, как я пытаюсь получить заголовок в моем тесте:

var header = _restContext.HttpResponseMessage.Headers.SingleOrDefault(x => x.Key == "x-timetoprocessmilliseconds"); 

ответ

0

Я не знаю, что разница между вашей живой setup и unit-test, но вы должны знать, что если какое-либо предыдущее промежуточное программное обеспечение начинает записываться в response.Body, заголовки отправляются до того, как конвейер OWIN вернется к вашему промежуточному программному обеспечению (см. примечание ниже).

Что вы можете сделать, это установить обратный вызов на OnSendingHeaders, прежде чем вы будете использовать следующее промежуточное программное обеспечение.

private async Task CalculateTimeToProcess(IOwinContext context) 
{ 
    var sw = new Stopwatch(); 
    sw.Start(); 
    context.Response.OnSendingHeaders(state => 
    { 
     sw.Stop(); 
     var response = (IOwinResponse)state; 
     response.Headers.Add("x-timetoprocessmilliseconds", new[] { sw.ElapsedMilliseconds.ToString(CultureInfo.InvariantCulture) }); 
    }, context.Response); 
    await Next.Invoke(context); 
} 

Примечание: Посылая заголовки первых, они могут передать то, что будет записано в поток тела непосредственно в розетку без буферизации, что в памяти. Это также означает, что ваше измерение будет неверным, если другое промежуточное программное обеспечение уже записывает в выходной поток при обработке данных ...

+0

Brilliant. Это сработало. Благодарю. –