当我尝试在Xamarin中发出POST请求时,函数GetRequestStream()
占用的时间是10-20秒。我的服务器上的答复时间低于1秒,我从网站发出的POST请求也是如此。
我已经尝试过:
我所做的一切实际上都是帮助减少运行时间,即使是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相关的。
答案 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'即可解决问题。