2017-08-16 13 views
8

にアクセスし、することはできませんPOSTリクエストを送信し、 は、最初のiが正常に取得受けるが、私はPOSTリクエストを送信するとき、それは私のコードrequestStream.Write(bytes, 0, bytes.Length);Xamarin AndroidのHttpWebRequestの、そして私はAndroidモバイルアプリを持っている、と私はいくつかのデータを投稿するサーバにWebRequestクラスを送信したいのですが、データを投稿する前に私はいくつかのデータを取得するためのHTTP GETリクエストを送信破棄されたオブジェクト

のこの行に怒鳴る例外をスローする例外は次のとおりです。

System.ObjectDisposedException:配置されたにアクセスできませんオブジェクト。 オブジェクト名: 'System.Net.Sockets.NetworkStream'。私は何の問題もなく、私の結果を受け取得し、ここで私のPOSTでこのコードの

public void GetTokenInfo() 
     { 

      try 
      { 
       var uri = new Uri(string.Format(_host + "webserver/SesTokInfo", string.Empty)); 
       var webRequest = WebRequest.Create(uri); 
       using (var response = webRequest.GetResponse() as HttpWebResponse) 
       { 
        using (var requestStream = response.GetResponseStream()) 
        { 
         using (var reader = new StreamReader(requestStream)) 
         { 
          var content = reader.ReadToEnd(); 
          XmlDocument xDocument = new XmlDocument(); 
          xDocument.LoadXml(content); 
          XmlElement root = xDocument.DocumentElement; 
          if (IsResponseReturned(root)) 
          { 
           GlobalConfig.SessionId = root.GetElementsByTagName("SesInfo")[0].InnerText; 
           GlobalConfig.Token = root.GetElementsByTagName("TokInfo")[0].InnerText; 

          } 
         } 
        } 
       } 
      } 
      catch (Exception exception) 
      { 
       Debug.WriteLine(exception); 
      } 
     } 

public WebResponse PostData(string body, string url) 
     { 
      WebResponse webResponse = null; 
      try 
      { 
       var uri = new Uri(string.Format(_host + url, string.Empty)); 
       var webRequest = (HttpWebRequest)WebRequest.Create(uri); 
       webRequest.Headers.Add("Cookie", 
        GlobalConfig.SessionId); 
       webRequest.Headers.Add("_RequestVerificationToken", GlobalConfig.Token); 
       webRequest.Method = "POST"; 
       webRequest.ContentType = "application/xml"; 
       byte[] bytes = Encoding.UTF8.GetBytes(body); 
       webRequest.ContentLength = bytes.Length; 
       Stream requestStream = webRequest.GetRequestStream(); 
       requestStream.Write(bytes, 0, bytes.Length); 
       webResponse = webRequest.GetResponse(); 
      } 
      catch (Exception exception) 
      { 
       Console.WriteLine(exception); 
      } 
      return webResponse; 
     } 

とここで私のGETとPOSTリクエストコードは GETです私は、検索および方法を試してみましたが、私は解決策を取得していない、とプラス私は最初の関数をコメントしたときに、唯一の第2の機能を実行し、それが正常に動作しますが、私は最初にした後、第2の実行時に例外をスローしています最初のコードからストリームとWebレスポンスを処理することは何ですか? 私は文を使用してすでにそれらを処分すると思います。

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

答えて

1

と上記の答えを読んで、私は1をGET 、次のようなコードの両方を行うことで問題を解決します最終的にそれらを試してみてください。

   var uri = new Uri(string.Format(_host + "webserver/SesTokInfo", string.Empty)); 
       var webRequest = WebRequest.Create(uri); 
       using (var response = webRequest.GetResponse() as HttpWebResponse) 
       { 
        using (var reader = new StreamReader(response.GetResponseStream())) 
        { 
         var content = reader.ReadToEnd(); 
         XmlDocument xDocument = new XmlDocument(); 
         xDocument.LoadXml(content); 
         XmlElement root = xDocument.DocumentElement; 
         if (IsResponseReturned(root)) 
         { 
          GlobalConfig.SessionId = root.GetElementsByTagName("SesInfo")[0].InnerText; 
          GlobalConfig.Token = root.GetElementsByTagName("TokInfo")[0].InnerText; 

         } 
        } 
       } 

とPOST 1:

   var uri = new Uri(string.Format(_host + url, string.Empty)); 
       var webRequest2 = (HttpWebRequest)WebRequest.Create(uri); 


       webRequest2.Headers.Add("Cookie", 
        GlobalConfig.SessionId); 
       webRequest2.Headers.Add("_RequestVerificationToken", GlobalConfig.Token); 
       webRequest2.Method = "POST"; 
       webRequest2.ContentType = "application/xml"; 

       byte[] bytes = Encoding.UTF8.GetBytes(body); 
       webRequest2.ContentLength = bytes.Length; 
       StreamWriter writer = new StreamWriter(webRequest2.GetRequestStream()); 
       writer.Write(bytes); 
       webResponse = webRequest2.GetResponse(); 

ブロックを使用してリクエストストリームを使用すると、まだ例外がスローされますが、ブロックを使用すると動作します:)

3
  • は、インターネットに接続されたデバイス/エミュレータですか?

  • アプリケーションは、インターネットに接続するための許可を必要としてきましたか?

  • あなたは他のあなたは、メモリの使いすぎの問題を抱えているだろう、あなたのGetTokenInfo()方法のようにIDisposableをオブジェクトのためのusingを使用するために必要なwebRequest.GetResponse()

  • 呼び出しの前に要求ストリームrequestStream.Close()を閉じる必要があり

私はちょうどあなたのコードとITがワークスをテストし、これが私の完全なテストコンソールアプリケーションです

using System; 
using System.IO; 
using System.Net; 
using System.Text; 

namespace test01 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      Console.WriteLine("Hello World!"); 
      PostData("a", "/"); 
     } 

     public static WebResponse PostData(string body, string url) 
     { 
      WebResponse webResponse = null; 
      try 
      { 
       var uri = new Uri(string.Format("http://google.it" + url, string.Empty)); 
       var webRequest = (HttpWebRequest)WebRequest.Create(uri); 
       webRequest.Headers.Add("Cookie","test"); 
       webRequest.Headers.Add("_RequestVerificationToken", "test"); 
       webRequest.Method = "POST"; 
       webRequest.ContentType = "application/xml"; 
       byte[] bytes = Encoding.UTF8.GetBytes(body); 
       webRequest.ContentLength = bytes.Length; 
       Stream requestStream = webRequest.GetRequestStream(); 
       requestStream.Write(bytes, 0, bytes.Length); 
       webResponse = webRequest.GetResponse(); 
      } 
      catch (Exception exception) 
      { 
       Console.WriteLine(exception); 
      } 
      return webResponse; 
     } 
    } 
} 
+0

ありがとうございました。私はGetResponseへの呼び出しを取得する前に、それは例外requestStream.Write(バイト、0、bytes.Length)をスローする、インターネットにnected。私はバイトを書くと、私は2番目のメソッドを実行するときに動作しているが、私は最初のメソッドを実行し、次に2番目のメソッドは、例外、任意のアイデアをスローするとき? –

5

これはちょうど彼らが正しくときに適切な発信および着信ストリームを閉じて扱うように正しいusingステートメントを使用してください作るの場合もあります。以下の変形例を参照してください、これはあなたのために働く必要があります。

public string PostData(string body, string url) 
{ 
    string responseText = null; 

    try 
    { 
     var uri = new Uri(string.Format(_host + url, string.Empty)); 
     var webRequest = WebRequest.Create(uri) as HttpWebRequest; 

     webRequest.Headers.Add("Cookie", GlobalConfig.SessionId); 
     webRequest.Headers.Add("_RequestVerificationToken", GlobalConfig.Token); 
     webRequest.Method = "POST"; 
     webRequest.ContentType = "application/xml"; 

     using (Stream requestStream = webRequest.GetRequestStream()) 
     { 
      using (StreamWriter writer = new StreamWriter(requestStream)) 
      { 
       writer.Write(body); 
      } 
     } 

     var webResponse = webRequest.GetResponse() as HttpWebResponse; 

     using (Stream responseStream = webResponse.GetResponseStream()) 
     { 
      using (StreamReader reader = new StreamReader(responseStream)) 
      { 
       responseText = reader.ReadToEnd(); 
      } 
     } 
    } 
    catch (Exception exception) 
    { 
     Console.WriteLine(exception); 
    } 

    return responseText; 
} 

注私は、文字列本体に戻り変数を変更したあなたが潜在的にオープンストリームを残さないように。

倖田

+0

多くのお返事ありがとうございます、私はあなたのコードを使用しましたが、それはまだ同じですが、私はhttpClientと両方の機能を非同期に使用して考え出し、 –

1

念のために - 使用して余分を削除してみてください - 代わり

using (var requestStream = response.GetResponseStream()) { using (var reader = new StreamReader(requestStream))

使用

using (var reader = new StreamReader(response.GetResponseStream())

の詳細についてhttps://msdn.microsoft.com/library/ms182334.aspxを参照してください。多くの方法を試した後

+0

お返事ありがとう、私は今あなたの方法を試して、私は同じ例外があります。 :( –

+0

行呼び出しで例外が発生しますか? –

+0

この行の例外はrequestStream.Write(bytes、0、bytes.Length)ですが、以下の回答を参照してください。 –

関連する問題