1. 程式人生 > >andriod 連接wcf ,HttpURLConnection FileNotFoundException

andriod 連接wcf ,HttpURLConnection FileNotFoundException

req tac tty void exce .com prop throw over

https://stackoverflow.com/questions/17991347/java-eofexception-when-getinputstream-from-post/18151239#18151239

If you use

conn.getInputStream()

everytime, it will throw a java.io.FileNotFoundException in the case when your request is unsuccessful, basically for any HTTP response code of 400 or above. In this case, your response body lies in

conn.getErrorStream()

Thus, you have to check the HTTP response code before you decide which stream to read from:

int status = conn.getResponseCode();
BufferedInputStream in;
if (status >= 400 ) {
    in = new BufferedInputStream( conn.getErrorStream() );
} else {
    in = new BufferedInputStream( conn.getInputStream() );
}
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder sb = new StringBuilder();
String str;
while ((str = reader.readLine()) != null) {
sb.append(str);
}

這樣就能看到錯誤信息啦。

或者在服務器端看WCF的報錯來看錯誤信息。

<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Warning" propagateActivity="true">

<listeners>
<add name="xml" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="D:\wcf.svclog" />
</sharedListeners>
</system.diagnostics>

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

setDoInput和setDoOutput的含義

  1. public void setDoInput(boolean doinput)將此 URLConnection 的 doInput 字段的值設置為指定的值。
  2. URL 連接可用於輸入和/或輸出。如果打算使用 URL 連接進行輸入,則將 DoInput 標誌設置為 true;如果不打算使用,則設置為 false。默認值為 true。
  3. public void setDoOutput(boolean dooutput)將此 URLConnection 的 doOutput 字段的值設置為指定的值。
  4. URL 連接可用於輸入和/或輸出。如果打算使用 URL 連接進行輸出,則將 DoOutput 標誌設置為 true;如果不打算使用,則設置為 false。默認值為 false。
  1. httpUrlConnection.setDoOutput(true);以後就可以使用conn.getOutputStream().write()
  2. httpUrlConnection.setDoInput(true);以後就可以使用conn.getInputStream().read();
  3. get請求用不到conn.getOutputStream(),因為參數直接追加在地址後面,因此默認是false。
  4. post請求(比如:文件上傳)需要往服務區傳輸大量的數據,這些數據是放在http的body裏面的,因此需要在建立連接以後,往服務端寫數據。
  5. 因為總是使用conn.getInputStream()獲取服務端的響應,因此默認值是true。

andriod 連接wcf ,HttpURLConnection FileNotFoundException