【问题标题】:How do I resolve 302 Error when using HttpClient?使用 HttpClient 时如何解决 302 错误?
【发布时间】:2019-01-24 21:55:11
【问题描述】:

我创建了一个自定义 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;
    } 

当我将此方法连接到单击事件时,会收到 HTTP 302 响应,但不会向 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 和相关属性的正确方法吗?

【问题讨论】:

    标签: c# dotnetnuke system.net


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。请查看我的更新并告知我是否有效地实施了此属性。非常感谢。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-02-15
      • 2011-04-09
      • 1970-01-01
      • 2021-09-04
      • 2019-11-02
      • 2020-02-22
      • 1970-01-01
      • 2020-06-28
      • 2022-01-17
      相关资源
      最近更新 更多