2017-12-13 22 views
0

XamarinでPOST要求を作成しようとすると、GetRequestStream()の機能に要する時間は10-20秒です。サーバーの応答時間は1秒以下で、POSTリクエストもWebサイトから作成しました。私はすでに試したPOST用のXamarin WebClient要求が極端に遅い

:nullにプロキシサーバーを設定する

  • それはのを取得するので、それはリクエストの周りにブロックを使用
  • をそれを見ないよう
  • をフラッシュは、最大接続
  • がした増加しました
  • RestSharpという別のクラスも試しました。同じ結果です。

実際に実行時間を100ミリ秒短縮するのに役立っていたことはありませんでした。私は彼のクロスプラットフォームアプリケーションでいくつかのHTTP要求をすることを決めた唯一の人にはなれないので、これがXamarinsの欠陥だとは想像できません。 ServiceManager(TLSサイトに接続するために使用するServiceManagerはUWPではサポートされていないので、私はすでに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

別のサーバーにリクエストを行い、応答を取得するのにどれくらいかかりましたか? – Gusman

+0

私はすでにサーバーをテストしていて、それは0.2秒で答えるので、サーバーのことは間違いありません。 悲しいことに、私は他のデバイスを持っていないし、それらのエミュレータはあまりにも実行されません.. –

答えて

0

私はちょうど答えを見つけました! プロトコルバージョンを設定するとスピードアップします。それは基本的にどこにも言及していないが、私はアンドロイドのポスト減速のためにグーグルで、私はそれを見つけた、最後に。 プロトコルバージョンをHTTP 1.1に設定すると、処理速度が非常に速くなります。

xamarin>でブート遅延を修正するだけで済みます。<

ありがとうございました!

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) 
     { 
     } 
    } 
} 

どのくらい速くなっているかフィードバックしてください。

+0

明日追加します:)私はできるだけ早くアップデートを投稿します。 NuGetが問題にならないことを願っています。 –

+0

大丈夫でした。これで21秒のリクエスト時間>>私は3つの異なるものを試したのでクラスの問題だとは思わない... 今何ができる? 本当にXamarinのことですか? –

+0

そのリクエストのURLをお知らせください。私はXamarinで書かれた巨大なアプリを持っています、そして、私は要求がかなり速く働くと言うことができます。郵便配達員やフィドラーで同じ要請をしてみましたか?あなたのHttpClientを実装するコードを提供できますか? –

関連する問題