DelegatingHandler 无法在 .NET MAUI 应用程序中使用 Refit 工作

问题描述 投票:0回答:1

我在所有移动应用程序中使用了这个 DelegatingHandler(请参阅本文的最后部分),这使我可以在 IDE 的输出窗口中看到所有网络内容,非常整洁。放心使用吧

现在,通常情况下,我会这样使用它:

httpClient = new HttpClient(new HttpLoggingHandler())
            {
                BaseAddress = new Uri("myUri"),
                Timeout = TimeSpan.FromSeconds(5)
            };

而且它一直有效。

现在我尝试在新应用程序中使用 HttpFactory 模式和 Refit

builder.Services.AddRefitClient<ILoginService>()
            .ConfigureHttpClient(c => c.BaseAddress = new Uri("myUri"))
            .AddHttpMessageHandler<HttpLoggingHandler>();
        return builder;

这行不通。我收到异常并且无法解析 MainPage

如果我评论 .AddHttpMessageHandler 部分,它就可以工作。

我做错了什么?任何帮助将不胜感激

 public class HttpLoggingHandler : DelegatingHandler
    {
        public HttpLoggingHandler(HttpMessageHandler? innerHandler = null)
            : base(innerHandler ?? new HttpClientHandler())
        {
        }

        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var req = request;
            string id = Guid.NewGuid().ToString();
            string msg = $"[{id} -   Request]";


            Debug.WriteLine($"{msg}========Start==========");
            Debug.WriteLine($"{msg} {req.Method} {req.RequestUri.PathAndQuery} {req.RequestUri.Scheme}/{req.Version}");
            Debug.WriteLine($"{msg} Host: {req.RequestUri.Scheme}://{req.RequestUri.Host}");

            foreach (var header in req.Headers)
            {
                Debug.WriteLine($"{msg} {header.Key}: {string.Join(", ", header.Value)}");
            }

            if (req.Content != null)
            {
                foreach (var header in req.Content.Headers)
                {
                    Debug.WriteLine($"{msg} {header.Key}: {string.Join(", ", header.Value)}");
                }

                if (req.Content is StringContent
                    || IsTextBasedContentType(req.Headers)
                    || IsTextBasedContentType(req.Content.Headers))
                {
                    string result = await req.Content.ReadAsStringAsync();

                    Debug.WriteLine($"{msg} Content:");
                    Debug.WriteLine($"{msg} {result}");
                }
            }

            var start = DateTime.Now;

            var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);

            var end = DateTime.Now;

            Debug.WriteLine($"{msg} Duration: {end - start}");
            Debug.WriteLine($"{msg}==========End==========");

            msg = $"[{id} - Response]";
            Debug.WriteLine($"{msg}=========Start=========");

            var resp = response;

            Debug.WriteLine(
                $"{msg} {req.RequestUri.Scheme.ToUpper()}/{resp.Version} {(int)resp.StatusCode} {resp.ReasonPhrase}");

            foreach (var header in resp.Headers)
            {
                Debug.WriteLine($"{msg} {header.Key}: {string.Join(", ", header.Value)}");
            }

            if (resp.Content != null)
            {
                foreach (var header in resp.Content.Headers)
                {
                    Debug.WriteLine($"{msg} {header.Key}: {string.Join(", ", header.Value)}");
                }

                if (resp.Content is StringContent
                    || IsTextBasedContentType(resp.Headers)
                    || IsTextBasedContentType(resp.Content.Headers))
                {
                    start = DateTime.Now;
                    string result = await resp.Content.ReadAsStringAsync();
                    end = DateTime.Now;

                    Debug.WriteLine($"{msg} Content:");
                    Debug.WriteLine($"{msg} {result}");
                    Debug.WriteLine($"{msg} Duration: {end - start}");
                }
            }

            Debug.WriteLine($"{msg}==========End==========");
            return response;
        }

        private readonly string[] types = { "html", "text", "xml", "json", "txt", "x-www-form-urlencoded" };

        private bool IsTextBasedContentType(HttpHeaders headers)
        {
            IEnumerable<string> values;
            if (!headers.TryGetValues("Content-Type", out values))
            {
                return false;
            }

            string header = string.Join(" ", values).ToLowerInvariant();

            return types.Any(t => header.Contains(t));
        }
    }

我被困住了,任何帮助将不胜感激

c# httpclient maui refit
1个回答
0
投票

找到解决方案! 这里在.net core中使用Refit时如何记录HTTP请求?

从自定义处理程序中删除构造函数就可以了。处理程序的当前实现始终使用参数化构造函数来初始化自身,这使得 InnerHandler 不为 null。

现在一切正常了!

© www.soinside.com 2019 - 2024. All rights reserved.