用于POST请求的Xamarin WebClient非常慢

时间:2017-12-13 19:56:03

标签: c# http post xamarin

当我尝试在Xamarin中发出POST请求时,函数GetRequestStream()占用的时间是10-20秒。我的服务器上的答复时间低于1秒,我从网站发出的POST请求也是如此。

我已经尝试过:

  • 将代理服务器设置为null,以便它不会查找
  • 在请求周围使用块以便刷新
  • 增加最大连接数
  • 使用异步多线程完成所有内容
  • 甚至尝试了另一个名为RestSharp的类 - 结果相同。

我所做的一切实际上都是帮助减少运行时间,即使是100毫秒。我无法想象这是Xamarins的错,因为我不能成为唯一一个决定在他的跨平台应用程序中做一些HTTP请求的人。我已经丢失了UWP,因为我用来连接到TLS站点的ServiceManager在UWP中是不受支持的 - 谢谢Xamarin。

我真的需要解决方案,所以请帮助:)

这是我使用和优化的代码:

byte[] byteArray = Encoding.UTF8.GetBytes(query);
HttpWebRequest webRequest = new HttpWebRequest(uri);
webRequest.Method = "POST";
webRequest.Proxy = null;
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.Timeout = 1000;
webRequest.ReadWriteTimeout = 1000;
Stream dataStream = await webRequest.GetRequestStreamAsync();
await dataStream.WriteAsync(byteArray, 0, byteArray.Length);
dataStream.Close();
WebResponse webResponse = await webRequest.GetResponseAsync();
using (StreamReader reader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
{
     string ret = await reader.ReadToEndAsync();
     return ret;
}

这是我尝试使用ModernHttpClient

的代码
System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(new NativeMessageHandler());
Dictionary<string, string> values = new Dictionary<string, string>();
string[] q = query.Split('&');
for (int i = 0; i < q.Length; i++)
     values.Add(q[i].Split('=')[0], q[i].Split('=')[1]);
FormUrlEncodedContent content = new FormUrlEncodedContent(values);
HttpResponseMessage response;
try
{
     response = await client.PostAsync(uri, content);
     string answer = await response.Content.ReadAsStringAsync();
     return answer;
}
catch (Exception e)
{
     return "";
}

当然我在调用整个网络之前添加了这些行

ServicePointManager.ServerCertificateValidationCallback += (a, b, c, d) => { return true; };
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.Expect100Continue = false;
ServicePointManager.DefaultConnectionLimit = 100;

这绝对是一个Xamarin或Android问题。我没有其他设备来测试它,但是......我现在能做什么?我在.Net控制台应用程序上测试了它,所以它绝对不是.Net相关的。

3 个答案:

答案 0 :(得分:0)

在您的代码中尝试实施ModernHttpClientPlugin

在初始化新的HttpClient时只需添加此行,一切都应该运行得更顺畅。

var httpClient = new HttpClient(new NativeMessageHandler());

另一个想法是尝试在新的空白控制台应用程序中实现。然后你会看到你的服务器/客户端或Xamarin本身是否有问题。看起来应该是这样的。

class Program
{
    static void Main(string[]args)
    {
        MainAsync(null);
        Console.ReadKey();
    }

    static async System.Threading.Tasks.Task MainAsync(string[] args)
    {

        System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
        Dictionary<string, string> values = new Dictionary<string, string>();
        var query = "user=mickey&passwd=mini";
        string[] q = query.Split('&');
        for (int i = 0; i < q.Length; i++)
            values.Add(q[i].Split('=')[0], q[i].Split('=')[1]);

        FormUrlEncodedContent content = new FormUrlEncodedContent(values);
        HttpResponseMessage response;
        try
        {
            response = await client.PostAsync(new Uri("https://www.example.com/login.php"), content);
            string answer = await response.Content.ReadAsStringAsync();
        }
        catch (Exception e)
        {
        }
    }
}

请告诉我们反馈速度有多快。

答案 1 :(得分:0)

我刚刚找到了答案! 当我设置协议版本时它会加速。它提到的基本上没有,但我用谷歌搜索安卓后减速,我终于找到了它。 将协议版本设置为HTTP 1.1可以加快速度!

现在我只需用xamarin&gt;修复启动延迟。&lt;

非常感谢你的帮助!

答案 2 :(得分:0)

在我的情况下,“ WebClient”和“ HttpWebReuest”在某些特定的Android 7设备上导致大约20秒的首次延迟(可能在解析新主机期间),但在其他设备上效果很好。

我尝试了不同的方法来解决此问题,但对我来说,仅替换为'HttpClient'即可解决问题。