2017-12-13 17 views
0

Xamarin에서 POST 요청을 만들 때 GetRequestStream() 함수의 시간은 10-20 초입니다. 내 서버의 응답 시간은 1 초 미만이므로 웹 사이트에서 POST 요청을합니다.POST 용 Xamarin WebClient 요청이 매우 느립니다.

이미 시도

:

  • 그것의가
  • 했던 최대 연결 수를 증가 플러시 수 있도록이 요청 주위에 블록을 사용하여
  • 을 보이지 않는 것 때문에 null로 프록시 서버 설정 비동기 멀티 스레딩을 포함한 모든 것
  • RestSharp라는 또 다른 클래스를 사용해도 마찬가지입니다.

아무 것도 실제로 100 밀리 초까지 런타임을 줄이는데 도움이되었습니다. 나는 크로스 플랫폼 애플리케이션에서 일부 HTTP 요청을하기로 결정한 유일한 사람이 아니기 때문에 Xamarins의 잘못이라고 생각할 수 없습니다. ServiceManager가 TLS 사이트에 연결하는 데 사용하기 때문에 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; 

그것은 확실히 자 마린 또는 안드로이드 문제입니다. 나는 테스트 할 다른 장치가 없지만 ... 지금 무엇을 할 수 있습니까? .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를 구현하는 코드를 제공 할 수 있습니까? –