Я считаю, что могу повторно использовать обработчики сообщений на стороне сервера с обработчиками сообщений httpclient, поскольку они буквально одинаковы, но я просто хочу убедиться, потому что я не уверен на 100%.
В настоящее время я пишу сервисы отдыха в веб-API, одна из задач состоит в том, что
Я должен регистрировать запрос и ответ на каждый запрос.
Эти службы также вызывают внутреннюю другую службу, чтобы получить некоторые данные для этого. Я использую HTTP-клиент. здесь также мне нужно войти в
запрос / ответ.
Мой обработчик сообщений выглядит следующим образом
public class ApiLoggingHandler : DelegatingHandler
{
private readonly CustomLogType customLogType;
public ApiLoggingHandler(HttpMessageHandler innerHandler, CustomLogType customLogType)
: base(innerHandler)
{
}
public ApiLoggingHandler(CustomLogType customLogType)
{
this.customLogType = customLogType;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var logger = CustomLogFactory.Create(customLogType);
Tuple<string,string> controllerActionNames = GetControllerActionName(request);
Dictionary<string, string> requestHeaders = request.Headers?.ToDictionary(a => a.Key, a => string.Join(";", a.Value));
await LogRequestAsync(request,request.RequestUri?.PathAndQuery, controllerActionNames.Item1, controllerActionNames.Item2, requestHeaders, logger);
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
Dictionary<string, string> responseHeaders = response.Headers?.ToDictionary(a => a.Key, a => string.Join(";", a.Value));
await LogResponseAsync(response, request.RequestUri?.PathAndQuery, controllerActionNames.Item1, controllerActionNames.Item2, responseHeaders, logger);
return response;
}
вот наш обработчик моего сообщения, зарегистрированный на global.ascx
config.MessageHandlers.Add(new ApiLoggingHandler(CustomLogType.LOG4NET));
Мой httpclient статичен и использует тот же обработчик сообщений, что и
public class WebRequestHandler
{
private static HttpClient client;
static WebRequestHandler()
{
client = new HttpClient(new ApiLoggingHandler(new HttpClientHandler(),CustomLogType.LOG4NET));
}
public async Task<TResult> GetAsync<TResult>(string requesturl, string authToken)
{
try
{
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requesturl);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
if (!string.IsNullOrEmpty(authToken)) request.Headers.Add("Authorization", authToken);
HttpResponseMessage response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsAync<TResult>();
}
catch (HttpRequestException e)
{
throw e;
}
}
}
Пожалуйста, предложите, что я делаю правильно, и весы не вызывают никаких проблем.