public class ErrorHandler : DelegatingHandler
{
async protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
switch (response.StatusCode)
{
case HttpStatusCode.InternalServerError:
var error = await response.Content.ReadAsAsync<HttpError>();
response.StatusCode = HttpStatusCode.InternalServerError;
response.Content = new StringContent(ErrorTypeMessage.InternalServerError.ToString() + error["ExceptionMessage"] + " | " + error["StackTrace"], System.Text.Encoding.UTF8, "text/plain");
; break;
}
return response;
}
}
как выше Я использую обработчик для обработки ошибок и использования специального промежуточного программного обеспечения для регистрации ошибок следующим образом.IOwinResponse пуст
public sealed class MyLogger : OwinMiddleware
{
public MyLogger(OwinMiddleware next)
: base(next)
{
}
public override async Task Invoke(IOwinContext context)
{
var record = new ApiEntry
{
CallerIdentity = identity
};
await Task.Run(() =>
{
record.Request = new StreamReader(context.Request.Body).ReadToEnd();
byte[] requestData = Encoding.UTF8.GetBytes(record.Request);
context.Request.Body = new MemoryStream(requestData);
});
await Next.Invoke(context);
using (var buffer = new MemoryStream())
{
var stream = context.Response.Body;
context.Response.Body = buffer;
buffer.Seek(0, SeekOrigin.Begin);
using (var bufferReader = new StreamReader(buffer))
{
record.Response = await bufferReader.ReadToEndAsync();
buffer.Seek(0, SeekOrigin.Begin);
await buffer.CopyToAsync(stream);
context.Response.Body = stream;
}
}
//Record ApiEntry to a file as xml
}
}
Я пытаюсь прочитать ответ ошибки, который был установлен в обработчике от промежуточного слоя. Но record.Response
пуст. Могу ли я получить доступ к httpResponseMessage внутри промежуточного программного обеспечения или есть ли простой способ сделать это?
Это потому, что вы пытаетесь получить доступ к ответу на пути в трубопровод. а не на выход. вам нужно передать контекст через конвейер и получить к нему доступ на своем пути. add 'await Next.Invoke (context);' перед попыткой получить доступ к ответу. – Nkosi
Не сожалею, я добавил, что ('await Next.Invoke (context);') уже до этого кода внутри промежуточного программного обеспечения. Я могу прочитать код состояния, который установлен обработчиком **. Но не сообщение, я хочу получить тело внутри IOwinResponse. Я не знаю, могу ли я прочитать это внутри IOwinResponse, установив его в HttpResponseMessage. У меня нет хорошей идеи. Как связаны «HttpResponseMessage» и «IOwinResponse». –
'Как HttpResponseMessage и IOwinResponse связаны.' Это не так. – Nkosi