IOwinResponse 为空
IOwinResponse is empty
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;
}
}
如上我使用处理程序来处理错误并使用自定义中间件来记录错误,如下所示。
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 还是有简单的方法可以做到这一点?
谢谢 Nikoshi,正如您所说,我也找不到 HttpResponseMessage 和 IOwinResponse 之间的关系。最后我能够使用
解决这个问题
DelegatingHandler
使用 DelegatingHandler 实现自定义处理程序。
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;
}
}
如上我使用处理程序来处理错误并使用自定义中间件来记录错误,如下所示。
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 还是有简单的方法可以做到这一点?
谢谢 Nikoshi,正如您所说,我也找不到 HttpResponseMessage 和 IOwinResponse 之间的关系。最后我能够使用
解决这个问题DelegatingHandler
使用 DelegatingHandler 实现自定义处理程序。