代码之家  ›  专栏  ›  技术社区  ›  SidC

使用HttpClient时如何解决302错误?

  •  0
  • SidC  · 技术社区  · 7 年前

    我创建了一个自定义DNN模块,它使用HTTPClient将信息发送到外部API。我的HttpClient方法如下:

    public static async Task<string> CreatePayerResponse()
        {
            var credentials = GetCredentials();
            var objEventLog = new EventLogController();
            var gatewaySettings = new GatewaySetting_ProPay();
            SignupResult_ProPay result = new SignupResult_ProPay();
            using (HttpClient client = new HttpClient(new LoggingHandler(new HttpClientHandler())))
            {
                HttpRequestMessage request = new HttpRequestMessage();
                HttpResponseMessage response = new HttpResponseMessage();
                response.EnsureSuccessStatusCode();
                client.BaseAddress = new Uri("https://xmltestapi.propay.com/ProPayAPI/signup");
                client.DefaultRequestHeaders.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
                string responseBody;
                GatewaySetting_ProPay gatewaySetting = new GatewaySetting_ProPay();
                SignupRequest payerRequest = new SignupRequest();
                HttpContent content = new StringContent(payerRequest.ToString());
                try
                {
                    request.Headers.Add("Authorization", credentials);
                    request.Headers.Add("accept", "application/json");
                    response = await client.PutAsync("https://xmltestapi.propay.com/ProPayAPI/signup", content);
                    responseBody = await response.Content.ReadAsStringAsync();
                    objEventLog.AddLog("Merchant Onboarding Request Sent", portalSettings, userId,
                        response.ToString(), EventLogController.EventLogType.ADMIN_ALERT);
                    Console.WriteLine(responseBody);
    
                }
                catch (HttpRequestException ex)
                {
                    result.Succeeded = false;
                    result.Status = ex.Message;
                    objEventLog.AddLog("Merchant Onboarding Error!", portalSettings, userId, response.ToString(),
                        EventLogController.EventLogType.ADMIN_ALERT);
                    Console.WriteLine("\nException Caught!");
                    Console.WriteLine("Message :{0} ", ex.Message);
                }
    
                return response.Content.ToString();
            }
        }
    public static string GetCredentials()
        {
            GatewaySetting_ProPay gatewaySettings = new GatewaySetting_ProPay();
            var billerAccountId = "mycreds";
            var authToken = "mycreds";
            var encodedCredentials =
                Convert.ToBase64String(Encoding.Default.GetBytes(billerAccountId + ":" + authToken));
            var credentials = string.Format("Basic {0}", encodedCredentials);
            return credentials;
        } 
    

    当我将此方法连接到一个click事件时,会收到一个http302响应,而不会向API发送任何内容。需要进行哪些修改以确保正确传输?

    使现代化

    Error code 302 was received from server response.
    

    尽管实施了 AllowAutoRedirect 属性并将其设置为true。下面是我编写的LoggingHandler类:

    public LoggingHandler(HttpMessageHandler innerHandler) : base(innerHandler)
        {
    
        }
        protected async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken, HttpClientHandler handler)
        {
            Console.WriteLine("Request:");
            Console.WriteLine(request.ToString());
            if (request.Content != null)
            {
                Console.WriteLine(await request.Content.ReadAsStringAsync());
            }
            Console.WriteLine();
            handler.AllowAutoRedirect = true;
            HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
    
    
            Console.WriteLine("Response:");
            Console.WriteLine(response.ToString());
            if (response.Content != null)
            {
                Console.WriteLine(await response.Content.ReadAsStringAsync());
            }
            Console.WriteLine();
    
            return response;
        }
    

    这是实现HttpClientHandler和相关属性的正确方法吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   WhoKnows    7 年前

    确保HttpClientHandler实例的AllowAutoRedirect属性设置为true,并由HttpClient使用。

        2
  •  0
  •   SidC    7 年前

    在实现System.Net.Http和相关名称空间的跟踪日志后,日志表明连接已被强制关闭。经过进一步研究,发现.NET Framework 4.5与更现代的传输层安全性(TLS)版本不兼容。因此,从DNN应用程序调用API的方法不得不放弃,因为我们正在扩展的源代码的目标是.NET Framework 4.5版。