2016-04-13 18 views
0

yaparken ben kod böyle parça var "Bu akış işlemlerini aramaya desteklemiyor":HttpWebRequest

var uri = "myURL.com" 
var request = (HttpWebRequest)WebRequest.Create(uri); 
string postData = "myData"; 
byte[] data = Encoding.UTF8.GetBytes(postData); 

request.Method = "POST"; 
request.UseDefaultCredentials = true; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = data.Length; 
request.AddRange(1024); 
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36"; 

Stream stream = request.GetRequestStream(); 
stream.Write(data, 0, data.Length); 
WebResponse response = request.GetResponse(); 
Console.WriteLine(((HttpWebResponse)response).StatusDescription); 
string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 
Console.WriteLine(responseString); 
response.Close(); 
stream.Close(); 

Ve ben bir istisna olsun: "Bu akış işlemlerini aramaya desteklemez". Bu hata, stream.Length ve stream.Position'da oluşur. Ve düşünmeme rağmen, bu hata yüzünden postData sunucuma gönderilmez. Here is the screenshot of the exception

+0

Cadı çizgisinde hata mı var? Stacktrace'i de verebilir misin? – Kalten

+0

Bu tam olarak bir hata değil, istisnadır (bunu ekran görüntüsünde gösterdim). Ancak, örneğin, stream.Position = 0 gibi bir yazı yazdığımda, bu hata iletisiyle şöyle olur: System.dll dosyasında 'System.NotSupportedException' türünde işlenmeyen bir özel durum oluştu. Ek bilgi: Bu akış arama işlemlerini desteklemiyor.' – Anastasia

+0

Sorunun çözümü: 'request.GetResponse()' öncesindeki kodun sonundan 'stream.Close(); Akış kapatılmadan Yanıt alamıyor. – Anastasia

cevap

1

Bu özel durum, yalnızca geçerli akışla uyumlu olmayan bir yöntem veya özellik çağırdığınızda (durumunuzdaki NetworkStream) atılır. Geriye doğru gitmeniz gerekiyorsa, içeriği geçici bir akışa (MemoryStream, FileStream, ...) kopyalamanız gerekir.

Örnek kodunuz bu senaryoda sorun yok. Visual Studio'da görebileceğiniz istisna, VS'nin bir değeri görüntülemek için her bir özelliğe erişmeyi denemesidir. Kodunuz çalışırken, 'Konum' gibi özellikler aranmaz ve her şey yolundadır.

Akışta arayabilmeniz için programatik olarak bilmek. Akışın CanSeek özelliğini kullanın.