0
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
}
}
는 I는 미들웨어 핸들러에서 설정된 오류 응답을 읽는 것을 시도. 그러나 record.Response
은 비어 있습니다. 미들웨어 내에서 httpResponseMessage에 접근 할 수 있습니까? 아니면 쉽게 할 수 있습니까?
이는 파이프 라인으로가는 도중에 응답에 액세스하려고하기 때문입니다. 탈출구에 있지 않아. 파이프 라인을 통해 컨텍스트를 전달하고 다시 액세스 할 때 액세스해야합니다. 응답에 액세스하기 전에'await Next.Invoke (context); '를 추가하십시오. – Nkosi
미안 해요 미들웨어 내부에 이미이 코드 앞에 ('await Next.Invoke (context);') 추가했습니다. ** 처리기 **에 의해 설정된 상태 코드를 읽을 수 있지만 메시지가 아니라 IOwinResponse 안에 본문을 가져 오려고합니다. IOwinResponse 내부에서 'HttpResponseMessage'로 설정하여 읽을 수 있는지 여부를 모르겠습니다. 나는 좋은 생각이 없다. 'HttpResponseMessage'와'IOwinResponse'가 어떻게 관련이 있는가? –
'HttpResponseMessage와 IOwinResponse가 어떻게 관련이 있나 .' 그들은 그렇지 않습니다. – Nkosi