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 实现自定义处理程序。