如何在HttpClient response.ReasonPhrase中获取真正的错误消息?
我的设定
我有2个WebApi项目,具有以下流程:
- 用户向API 1发出请求
- API 1代表用户向API 2发出请求(使用
HttpClient
)。
using (var client = new HttpClient()) { client.SetBearerToken(token); string endpoint = PbbSettings.Identity.Users.Delete.Replace("{userId}", userId); // Attempt deletion of the user using (var response = await client.DeleteAsync(endpoint)) { // Throw exception if not succeeded EnsureSuccess(response); } }
问题
所以控制和信息的流动很好。 问题是当API 2响应错误时, response.ReasonPhrase
“Bad Request”或“Internal Server Error”,而不是我在exception中设置的消息。
现在已经整整一天吐血了。 任何见解?
更多信息(TLDR)
为清楚起见,我的所有API都注册了一个全局exceptionfilter来处理错误:
public class RepositoryExceptionsHandlerAttribute : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext context) { HandleException(context); base.OnException(context); } public override Task OnExceptionAsync(HttpActionExecutedContext context, CancellationToken cancellationToken) { HandleException(context); return base.OnExceptionAsync(context, cancellationToken); } /// /// Recognizes common repository exceptions and if necessary creates a response and updates the context. /// /// The context in which the exception was thrown. private void HandleException(HttpActionExecutedContext context) { var response = CreateResponse(context.Request, context.Exception); if (response != null) context.Response = response; } /// /// Recognizes common repository exceptions and creates a corresponding error response. /// /// The request to which the response should be created. /// The exception to handle. /// An error response containing the status code and exception data, or null if this is not a common exception. private HttpResponseMessage CreateResponse(HttpRequestMessage request, Exception ex) { string message = ex.Message; if (ex is KeyNotFoundException) return request.CreateErrorResponse(HttpStatusCode.NotFound, message); if (ex is ArgumentException) return request.CreateErrorResponse(HttpStatusCode.BadRequest, message); if (ex is InvalidOperationException) return request.CreateErrorResponse(HttpStatusCode.BadRequest, message); if (ex is UnauthorizedAccessException) return request.CreateErrorResponse(HttpStatusCode.Unauthorized, message); #if !DEBUG // For security reasons, when an exception is not handled the system should return a general error, not exposing the real error information // In development time, the programmer will need the details of the error, so this general message is disabled. request.CreateErrorResponse(HttpStatusCode.InternalServerError, Errors.InternalServerError); #endif return null; } }
这在用户和API 1之间工作正常。 但是当API 1和API 2执行它们的操作时,响应创建会忽略我输入的消息并将状态设置为原因。
新的CreateResponse()方法:
/// /// Recognizes common repository exceptions and creates a corresponding error response. /// /// The request to which the response should be created. /// The exception to handle. /// An error response containing the status code and exception data, or null if this is not a common exception. private HttpResponseMessage CreateResponse(HttpRequestMessage request, Exception ex) { string message = ex.Message; HttpStatusCode code = 0; if (ex is KeyNotFoundException) code = HttpStatusCode.NotFound; else if (ex is ArgumentException) code = HttpStatusCode.BadRequest; else if (ex is InvalidOperationException) code = HttpStatusCode.BadRequest; else if (ex is UnauthorizedAccessException) code = HttpStatusCode.Unauthorized; else if (ex is HttpException) { // HttpExceptions are thrown when request between IdentityServer and the API server have failed. // IdentityServer has generated an error, the API server received it and now it needs to relay it back to the client. var httpException = (HttpException) ex; code = (HttpStatusCode) httpException.GetHttpCode(); message = httpException.Message; } else { code = HttpStatusCode.InternalServerError; // For security reasons, when an exception is not handled the system should return a general error, not exposing the real error information // In development time, the programmer will need the details of the error, so this general message is disabled. #if DEBUG message = ex.Message; #else message = Errors.InternalServerError; #endif } // For some reason the request.CreateErrorResponse() method ignores the message given to it and parses its own message. // The error response is constructed manually. return CreateErrorResponse(request, code, message); } private HttpResponseMessage CreateErrorResponse(HttpRequestMessage request, HttpStatusCode code, string message) { var content = new { Message = message }; return new HttpResponseMessage(code) { ReasonPhrase = message, RequestMessage = request, Content = new ObjectContent(content.GetType(), content, new JsonMediaTypeFormatter()) }; } }
希望这只能救一个人的日子……;)
上述就是C#学习教程:如何在HttpClient response.ReasonPhrase中获取真正的错误消息?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/991858.html