【问题标题】:WebClient get/post to https always timeoutWebClient 获取/发布到 https 总是超时
【发布时间】:2016-03-23 15:56:08
【问题描述】:

我正在使用 Xamarin 开发移动应用程序。该应用程序正在使用一个 API,该 API 最近发布了一个使用 HTTPS 而不是 HTTP 的新版本。将 URL 更改为使用 HTTPS 并添加 atuhorization 标头时,请求会卡住并最终超时。例如,在 Postman 中进行测试时,API 调用工作正常。

所有 API 调用均来自可移植库,我在物理设备上运行应用程序。

有人对我能做些什么来解决这个问题有任何想法吗?

这是我用来向 API 发布数据的代码:

    private async Task<HttpResponseMessage> PostData(HttpContent content, string authKey)
    {
        using (var client = new HttpClient())
        {
                client.DefaultRequestHeaders.Add("Authorization", authKey);
                client.Timeout = new TimeSpan(0, 0, 25);

                var response = await client.PostAsync(BaseUrl, content);
                return response;
        }
    }

编辑

我尝试了许多不同的解决方案,设置标题、内容类型等,但没有任何效果。我尝试使用 HttpWebRequest 而不是 HttpClient 但没有成功。

我设置了一个 C# 控制台应用程序并创建了一个新的干净 Xamarin Android 项目。一切都在控制台应用程序中运行,但在 Xamarin 项目中却没有。

【问题讨论】:

  • 如果你在Android上测试,将设备连接到Android SDK监控工具并查看logcat,它可能会对问题有所了解。
  • 我知道这听起来很傻,但我曾经遇到过这种情况:我们在客户端的 baseurl 设置中包含了一个端口号(非标准 http:80),当我们切换服务器时忘记删除它监听默认的 80/443 端口

标签: c# xamarin webclient


【解决方案1】:

我让它在一个干净的 Xamarin Android 项目中工作,但仅在使用 ModernHttpClient 时。

但是在我的可移植类库中实现它时,它仍然不起作用。相反,将我的网络请求移动到特定平台项目使其工作!我最终使用了一个声明 post 方法的接口。每个平台项目都声明了一个 PCL 正在使用的“PostHandler”。

public interface IPostHandler
{
    Task<HttpResponseMessage> BeginPost(HttpContent content, string requestUri);
}

public class AndroidPostHandler : IPostHandler
{
    public async Task<HttpResponseMessage> BeginPost(HttpContent content, string requestUri)
    {
        using (var client = new HttpClient(new NativeMessageHandler()))
        {
            var response = await client.PostAsync(baseUrl, content);
            return response;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2012-04-02
    • 2019-05-21
    相关资源
    最近更新 更多