Могу ли я повторно использовать обработчик сообщений на стороне сервера с HttpClient на стороне клиента? - PullRequest
0 голосов
/ 12 июня 2019

Я считаю, что могу повторно использовать обработчики сообщений на стороне сервера с обработчиками сообщений httpclient, поскольку они буквально одинаковы, но я просто хочу убедиться, потому что я не уверен на 100%.

В настоящее время я пишу сервисы отдыха в веб-API, одна из задач состоит в том, что

  1. Я должен регистрировать запрос и ответ на каждый запрос.

  2. Эти службы также вызывают внутреннюю другую службу, чтобы получить некоторые данные для этого. Я использую 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;
        }
    }
}

Пожалуйста, предложите, что я делаю правильно, и весы не вызывают никаких проблем.

...