【发布时间】:2021-09-19 17:08:00
【问题描述】:
我正在开发一种中间件 API,旨在连接到各种系统。我正在使用 Flurl 库向各个系统发出请求。
其中一个系统有时会返回包含错误消息的自定义标头,而不是仅在响应正文中返回它(出于我不知道的原因)。
为了返回正确的错误信息,我使用了 Flurl 的 OnError 事件处理程序。我定义了检查此自定义标头的响应的行为,如果找到,则提取解码的消息并将其设置为请求的响应消息:
/// <summary>
/// Asynchronously checks responses from Thinkwise Indicium for TSFMessage headers and, if found,
/// decodes them and sets them as the actual error message of the response.
/// </summary>
/// <param name="request">The request of which the response must be checked for a Thinkwise message header.</param>
/// <returns>A Task.</returns>
public static async Task HandleThinkwiseErrorAsync(FlurlCall request)
{
if (request.Response.Headers.TryGetFirst("TSFMessages", out var message))
{
var decodedMessage = JsonSerializer.Deserialize<ThinkwiseSoftwareFactoryMessage>(
Encoding.UTF8.GetString(Convert.FromBase64String(message)));
var response = new HttpResponseMessage
{
StatusCode = HttpStatusCode.BadRequest,
RequestMessage = new HttpRequestMessage(request.Request.Verb, request.Request.Url),
Content = new StringContent(
decodedMessage?.RawMessage.Split("\"")[1]
?? await request.Response.ResponseMessage.Content.ReadAsStringAsync(default))
};
request.HttpResponseMessage = response;
request.ExceptionHandled = false;
}
}
虽然我之前确实有使用 Flurl 发出 HTTP 请求的经验,但像这样配置它对我来说还是第一次。我已经在 DI 容器中配置了 Flurl:
FlurlHttp.Configure(settings =>
{
settings.OnErrorAsync = IndiciumFlurlHelper.HandleThinkwiseErrorAsync;
settings.OnError = IndiciumFlurlHelper.HandleThinkwiseError; // Same as async method
});
我很难找到其他试图做类似事情的文章、问题或 SO 问题。我可能在某个地方犯了一个新手错误,或者只是误解了 FlurlCall 对象的构造方式以及属性的含义。
我遇到的问题是,当我发出请求时,我 知道 应该使用此标头返回错误消息,我的中间件 API 在应该返回 400 响应时返回 204 响应正文中的错误消息。
我做错了什么?请求似乎按预期工作,所以我很确定我以这种方式处理此响应标头做错了。
提前致谢!如果您还有其他问题,请留下评论。
【问题讨论】:
标签: c# api asp.net-core .net-core flurl