2014-02-07 4 views
1

HttpUrlConnection (InputStream에 액세스 할 때)에서 데이터를 읽으려고 할 때 Java.IO.EOFException이 발생합니다. OkHttp 라이브러리에서 xamarin을 사용하면 응용 프로그램이 genymotion 안드로이드 4.2.2Java.IO.EOFException 승인을 통해 프록시를 통해 OkHttpClient를 읽는 중

와 에뮬레이터 다음은 샘플 코드 (C#을)입니다 :

// ... 
     var okHttpClient = CreateHttpClient(); 
     var conn = okHttpClient.Open(new URL(address)); 
     var inputStream = conn.InputStream; //here is the exception 
    // ... 

    private OkHttpClient CreateHttpClient() 
    { 
     OkHttpClient client = new OkHttpClient(); 
     client.SetProxy(new Proxy(Proxy.Type.Http, new InetSocketAddress(Host, Port))); 
     client.SetAuthenticator(new MyAuthenticator(User, Password));    

     return client; 
    } 

    private class MyAuthenticator: Java.Lang.Object, IOkAuthenticator 
    { 
     private readonly string _user; 
     private readonly string _password; 

     public MyAuthenticator(string user, string password) 
     { 
      _user = user; 
      _password = password; 
     } 

     public OkAuthenticatorCredential Authenticate(Proxy p0, URL p1, IList<OkAuthenticatorChallenge> p2) 
     { 
      return OkAuthenticatorCredential.Basic(null, null); //this is never called 
     } 

     public OkAuthenticatorCredential AuthenticateProxy(Proxy p0, URL p1, IList<OkAuthenticatorChallenge> p2) 
     { 
      return OkAuthenticatorCredential.Basic(_user, _password); 
     } 
    } 

인증 모든 작동하지 않고 프록시는

. 나는 닷넷 모노 웹 클라이언트를 사용하는 경우

("가까운", "연결")는 프록시 인증과 함께 작동 (하지만 가능하면 모노 WebClient를 사용하지 않는 이유가)

해결 conn.SetRequestProperty을; 도움이 안돼.

스택 트레이스는 :

Download Error: Java.IO.EOFException: Exception of type 'Java.IO.EOFException' was thrown. 
    at Android.Runtime.JNIEnv.CallObjectMethod (IntPtr jobject, IntPtr jmethod) [0x00063] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.10.1-branch/d23a19bf/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:177 
    at Java.Net.URLConnection.get_InputStream() [0x00043] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.10.1-branch/d23a19bf/source/monodroid/src/Mono.Android/platforms/android-14/src/generated/Java.Net.URLConnection.cs:754 
    at MachiningCloud.AndroidNet.WebClient.DownloadFile (System.String address, System.String fileName) [0x0002c] in c:\Projects\iDPTech\Main\Source\DPTech.ToolSelector.Ios\MachiningCloud.AndroidNet\WebClient.cs:63 
    at UrlImageViewHelper.UrlImageViewHelper.DownloadImageToFile (System.String url, System.String filename) [0x00007] in c:\Projects\iDPTech\Main\Source\DPTech.ToolSelector.Ios\MonoDroid.UrlImageViewHelper.Android\UrlImageViewHelper.cs:387 
    at UrlImageViewHelper.UrlImageViewHelper.RunInBackgroundFunc (UrlImageViewHelper.TaskParams[] taskParams) [0x001c3] in c:\Projects\iDPTech\Main\Source\DPTech.ToolSelector.Ios\MonoDroid.UrlImageViewHelper.Android\UrlImageViewHelper.cs:349 
    --- End of managed exception stack trace --- 
java.io.EOFException 
    at com.squareup.okhttp.internal.Util.readAsciiLine(Util.java:342) 
    at com.squareup.okhttp.internal.http.RawHeaders.fromBytes(RawHeaders.java:311) 
    at com.squareup.okhttp.Connection.makeTunnel(Connection.java:313) 
    at com.squareup.okhttp.Connection.upgradeToTls(Connection.java:127) 
    at com.squareup.okhttp.Connection.connect(Connection.java:107) 
    at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294) 
    at com.squareup.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 
    at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 
    at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:351) 
    at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:297) 
    at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:180) 
    at com.squareup.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:246) 
    at urlimageviewhelper.AnonymousAsyncTask_3.n_doInBackground(Native Method) 
    at urlimageviewhelper.AnonymousAsyncTask_3.doInBackground(AnonymousAsyncTask_3.java:29) 
    at android.os.AsyncTask$2.call(AsyncTask.java:287) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
    at java.lang.Thread.run(Thread.java:856) 

어떤 도움을 주시면 감사하겠습니다.

감사합니다,

니콜라이

+0

ModernHttpClient를 사용해 보셨습니까? https://github.com/paulcbetts/ModernHttpClient? – Cheesebaron

+0

@Cheesebaron, 사실, 저는 ModernHttpClient의 NuGet 패키지에 설치된 OkHttp를 사용합니다. HttpClient 또는 OkHttpNetworkHandler (헤더를 통해?) 프록시 설정을 전달하는 방법을 모르므로 OkHttpClient (OkHttpNetworkHandler도 사용함)를 사용하십시오. –

+0

비슷한 문제가 있습니다. 실제로 스트레이트 HttpURLConnection (호출 스택을 보면 OkHttpClient도 사용하고 있음)을 사용하고 있습니다. 하지만 내가 발견 한 것은 HTTS URL에서만 발생하는 것으로, HTTP URL에서 잘 작동합니다. @NicolaiShestakov 2014 년에 게시 한 이후로 찾았습니까? –

답변

1

은 터널을 구축해야하는 HTTPS URL을 달성하기 위해 HTTP 프록시를 사용합니다. 이것은 실패하고있다. 프록시가 터널을 생성하지 않습니다. 사용중인 프록시가 도달하려는 URL을 지원하는지 확인 했습니까?

+0

.NET WebClient 클래스를 통해 작동하므로 프록시에서 확인해야합니다. –

+0

wireshark로 와이어 데이터를 캡처 할 수 있습니까? OkHttp가 처리 할 수없는 프록시가 보내는 것을 보는 것은 흥미로울 것입니다. –

+0

@JesseWilson 비슷한 문제가 있습니다. 그것은 HTTP와는 정상적으로 작동하지만 HTTPS에서는 작동하지 않습니다. 로컬 컴퓨터에서 Fiddler를 사용하고 있는데 HttpURLConnection을 사용하고 있습니다. 나는 C# 콘솔 앱에서 동일한 프록시와 동일한 자격증 명을 사용하여 HttpWebRequest를 사용하면 Fiddler에서 문제가되지 않는다고 확신합니다. HTTP와 HTTPS 모두에서 잘 작동합니다. –

2

오늘 같은 오류가 발생했습니다. 내 URL 문자열에 공백이 있습니다. % 20 (으)로 변경 한 후 문제가 사라졌습니다.