2017-08-16 71 views
8

我有一个Android手机应用程序,我想发送webrequest到服务器发布一些数据,但在发布数据之前,我发送一个http获取请求来获取一些数据,然后发送POST请求, 第一我收到顺利拿到,但是当我发送POST请求它抛出异常波纹管在此线路上我的代码requestStream.Write(bytes, 0, bytes.Length);Xamarin Android httpwebrequest,无法访问处置对象

的例外是:

System.ObjectDisposedException:无法访问已释放目的。 对象名称:'System.Net.Sockets.NetworkStream'。

,这里是我的GET和POST请求的代码 GET:

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; 
     } 

我已经搜索和尝试的方式,但我没有得到的解决方案,加上当我评论第一个功能,只运行第二个功能,它会正常工作,但是当我运行第一个,然后第二个引发异常,什么都属于从第一个代码处置流和Web响应?我认为使用声明已经配置它们。

任何帮助表示赞赏。

回答

1

尝试很多方法后,以上的答案阅读并试戴最后我得到通过使两个类似于下面的代码解决了这个问题, 得到一个:

   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之一:

   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
  • 是您的设备/仿真器连接到互联网?

  • 您的应用程序需要连接到互联网的权限?

  • 你必须调用webRequest.GetResponse()

  • 这是需要使用using为IDisposable的对象,如您GetTokenInfo()方法之前关闭请求流requestStream.Close(),否则你将有记忆的过度使用问题

我只是测试你的代码和它工作,这是我的全测试控制台应用程序

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

感谢您的回答,是我的设备con在我调用GetResponse之前,它会引发异常requestStream.Write(bytes,0,bytes.Length);当我写字节,它工作时,我只运行第二种方法,但是当我第一次运行第一种方法,然后第二种方法时,它会抛出异常,任何想法? –

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);但是修正见下面的答案。 –