【问题标题】:The server returned an invalid or unrecognized response error when using System.Net.Http.HttpClient使用 System.Net.Http.HttpClient 时服务器返回无效或无法识别的响应错误
【发布时间】:2018-02-20 11:40:19
【问题描述】:

最近我已将我的代码库从 .net core 1.0 迁移到 2.0 。之后,我随机收到错误 “服务器在使用 System.Net.Http.HttpClient 时返回了无效或无法识别的响应错误”。我在 100 个请求中有 2 个收到此错误。

还有如何调试它,因为它是随机发生的:(

program.cs

public class Program
    {
        public static void Main(string[] args)
        {
            var config = new ConfigurationBuilder()
            .AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(),"hosting.json"), optional: false)
            .Build();

            var useHttps = false;

            bool.TryParse(config !=null  ? config["useHttps"] : "false", out useHttps);

            IWebHost host = null;
            if (useHttps)
            {
                var fileInfo = new FileInfo(config["certName"]);
                X509Certificate2 cert = new X509Certificate2(fileInfo.FullName, config["certPwd"]);

                host = new WebHostBuilder()
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseStartup<Startup>()
                    .UseKestrel(options =>
                    {
                        options.Listen(IPAddress.Loopback, 5000);
                        options.Listen(IPAddress.Any, 4430, listenOptions =>
                        {
                            listenOptions.UseHttps(cert);
                        });
                    })
                    .UseIISIntegration()
                    .Build();
            }
            else
            {
                host = new WebHostBuilder()
                    .UseStartup<Startup>()
                    .UseKestrel()
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseIISIntegration()
                    .UseUrls(config["url"])
                    .Build();

            }
            host.Run();


        }
    }

HTTP 网络文件

public class NetworkExtensions
    {
        public static IConfiguration Configuration { get; set; }
        public static ILogger Log { get; set; }

        /// <summary>
        /// Flurl to get api
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="requestDto"></param> 
        /// <param name="rateLimit">This param is used to Perform OKTA api Retry </param> 
        /// <returns></returns>
        public static async Task<T> Get<T>(OktaRequestDto requestDto, OKTARateLimit rateLimit = null)
        {
            using (MiniProfiler.Current.Step("Okta : Get"))
            {

                // OKTA code execution starts here.
                string url = requestDto.BaseUrl
                    .AppendPathSegment(requestDto.ApiName + requestDto.Query);

                // Handle all querystring append.
                if (requestDto.QueryStrings != null && requestDto.QueryStrings.Count > 0)
                {
                    foreach (var querystring in requestDto.QueryStrings.Keys)
                    {
                        //FLURL is encoding the value, To ensure the value is passed correct, added true param to stop default behavior
                        url = url.SetQueryParam(querystring, requestDto.QueryStrings[querystring], true);
                    }
                }

                var response = await url.WithHeader("Authorization", requestDto.ApiKey).GetJsonAsync<T>();


                Log.Information("response  => " + JsonConvert.SerializeObject(response));

                return response;

                catch (FlurlHttpException ex)
                {
                    // there is an OKTA exception, return the default value, The exception is captured in the FLURLConfig
                    OneLoginException ole = new OneLoginException(ex, requestDto);
                    throw ole;

                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
    }

收到错误:

{"ClassName":"Flurl.Http.FlurlHttpException","Message":"GET https://xxx-yyy.oktapreview.com/api/v1/users/00ue1x6pgimMy2Zuf0h7 失败。发送请求时出错。","Data":{},"InnerException":{" ClassName":"System.Net.Http.HttpRequestException","Message":"发送请求时出错。","Data":{},"InnerException":{"ClassName" :"System.Net.Http.WinHttpException","Message":"服务器返回无效或无法识别的响应","Data":{},"InnerException":null,"HelpURL": null,"StackTraceString":" 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 在 System.Threading.Tasks.RendezvousAwaitable1.GetResult()\r\n at System.Net.Http.WinHttpHandler.&lt;StartRequest&gt;d__105.MoveNext()","RemoteStackTraceString":null,"RemoteStackIndex":0,"ExceptionMethod":null,"HResult":-2147012744,"Source":"System.Private.CoreLib","WatsonBuckets":null,"NativeErrorCode":12152},"HelpURL":null,"StackTraceString":" at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.ConfiguredTaskAwaitable1.ConfiguredTaskAwaiter.GetResult()\r\n 在 System.Net。 Http.DiagnosticsHandler.d__2.MoveNext()\r\n--- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 上一个引发异常的位置结束堆栈跟踪 ---\r\n\r\n在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()\r\n 在 System.Net.Http.HttpClient.d__58.MoveNext()\r\n--- 堆栈跟踪从上一个异常位置结束抛出 ---\r\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 Flurl.Http.FlurlRequest.d__19 .MoveNext()","RemoteStackTraceString":null,"RemoteStackIndex":0,"ExceptionMethod":null,"HResult":-2147012744,"Source":"System.Private.CoreLib","WatsonBuckets":null}, "帮助网址":null}

【问题讨论】:

  • 你能解决这个问题吗?

标签: httpclient asp.net-core-2.0 kestrel-http-server .net-core-2.0 kestrel


【解决方案1】:

我遇到了同样的问题并且仍然存在,所以我的解决方案是:将客户端请求块包装在尝试中,并在出现错误的情况下重复几次,根据: https://docs.microsoft.com/en-us/azure/architecture/patterns/retry

【讨论】:

  • 您能否提供一个代码示例来说明如何执行此操作?
  • 公共异步静态任务 HttpRequestToURL(string url) { string responseContent = "";布尔确定 = 假;整数尝试= 1; while (tries
猜你喜欢
  • 1970-01-01
  • 2021-08-02
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
相关资源
最近更新 更多