2017-08-16 17 views
8

Tôi có ứng dụng dành cho thiết bị di động Android và tôi muốn gửi yêu cầu web tới máy chủ để đăng một số dữ liệu, nhưng trước khi đăng dữ liệu, tôi gửi yêu cầu http để nhận một số dữ liệu, sau đó gửi bài yêu cầu, đầu tiên tôi nhận được có được thành công nhưng khi tôi gửi yêu cầu bài nó ném ngoại lệ dưới đây vào dòng này của mã của tôi requestStream.Write(bytes, 0, bytes.Length);Xamarin httpwebrequest trên Android, Không thể truy cập đối tượng được xử lý

ngoại trừ là:

System.ObjectDisposedException: không thể truy cập vào một thanh lý khoản vật. Tên đối tượng: 'System.Net.Sockets.NetworkStream'.

và đây là GET và POST yêu cầu mã của tôi 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); 
      } 
     } 

với mã này tôi nhận được kết quả của tôi mà không có vấn đề, và đây là POST của tôi:

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

tôi đã tìm kiếm và thử cách nhưng tôi không nhận được giải pháp, và cộng với khi tôi nhận xét hàm đầu tiên, và chỉ chạy hàm thứ hai, nó sẽ hoạt động tốt nhưng khi tôi chạy đầu tiên và sau đó nó sẽ ném ngoại lệ, có bất kỳ điều gì thuộc về việc xử lý luồng và phản hồi web từ mã đầu tiên không? tôi nghĩ rằng bằng cách sử dụng tuyên bố đã được sắp xếp chúng.

bất kỳ trợ giúp nào được đánh giá cao.

Trả lời

1

Sau khi thử nhiều cách và đọc trên câu trả lời và thử chúng cuối cùng tôi được giải quyết vấn đề bằng cách làm cho cả hai mã như sau, GET một:

   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; 

         } 
        } 
       } 

và POST một:

   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(); 

khi tôi sử dụng luồng yêu cầu bên trong sử dụng khối, nó sẽ vẫn ném ngoại lệ nhưng với việc sử dụng khối nó sẽ hoạt động :)

3
  • là thiết bị/bộ mô phỏng kết nối với internet?

  • ứng dụng của bạn đã yêu cầu giấy phép để kết nối internet?

  • Bạn phải đóng dòng yêu cầu requestStream.Close() trước khi gọi webRequest.GetResponse()

  • Nó là cần thiết để sử dụng using cho các đối tượng IDisposable như trong phương pháp GetTokenInfo() của bạn, nếu không bạn sẽ gặp vấn đề bộ nhớ sử dụng quá mức

Tôi chỉ kiểm tra mã của bạn và IT WORKS, đây là ứng dụng bảng điều khiển thử nghiệm đầy đủ của tôi

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

Cảm ơn câu trả lời của bạn, có thiết bị của tôi con nected internet, trước khi tôi nhận được cuộc gọi đến GetResponse nó ném ngoại lệ requestStream.Write (byte, 0, bytes.Length); khi tôi viết các byte, và nó hoạt động khi tôi chỉ chạy phương thức thứ hai, nhưng khi tôi lần đầu tiên chạy phương thức đầu tiên và sau đó phương thức thứ hai nó ném ngoại lệ, bất kỳ ý tưởng nào? –

5

Điều này có thể chỉ là trường hợp đảm bảo sử dụng đúng các câu lệnh using khi chúng xử lý đúng cách đóng các luồng gửi đi và luồng đến khi thích hợp. Xem ví dụ được sửa đổi dưới đây, thao tác này sẽ phù hợp với bạn:

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

Lưu ý Tôi đã sửa đổi biến trả về thành chuỗi để bạn không có khả năng để luồng mở.

Koda

+0

cảm ơn rất nhiều vì đã trả lời, tôi đã sử dụng mã của bạn nhưng không nhận được may mắn nó vẫn như cũ, tôi đã tìm ra bằng cách sử dụng cả hai hàm không đồng bộ với httpClient và đã làm việc nhưng với kiểu này vẫn nhận được ngoại lệ tương tự. –

1

chỉ để được an toàn - hãy thử gỡ bỏ thêm sử dụng - thay vì

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

sử dụng

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

Xem https://msdn.microsoft.com/library/ms182334.aspx để biết chi tiết.

+0

cảm ơn bạn đã trả lời, tôi đã cố gắng theo cách của bạn ngay bây giờ và tôi có cùng ngoại lệ. :( –

+0

tại cuộc gọi đường bạn nhận được ngoại lệ? –

+0

ngoại lệ là tại dòng này requestStream.Write (byte, 0, bytes.Length); nhưng cố định xem câu trả lời dưới đây. –

Các vấn đề liên quan