2011-02-08 27 views
9

a specific issue with my ASP.NET application hata ayıklamaya çalışıyorum.HttpWebRequest'i sunucudan çıkarmadan yeniden kullanabilir miyim?

void uploadFile(string serverUrl, string filePath) 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest. 
     Create(serverUrl); 
    CredentialCache cache = new CredentialCache(); 
    cache.Add(new Uri(serverUrl), "Basic", new NetworkCredential("User", "pass")); 
    request.Credentials = cache; 
    request.Method = "POST"; 
    request.ContentType = "application/octet-stream"; 
    request.Timeout = 60000; 
    request.KeepAlive = true; 

    using(BinaryReader reader = new BinaryReader( 
     File.OpenRead(filePath))) { 

     request.ContentLength = reader.BaseStream.Length; 
     using(Stream stream = request.GetRequestStream()) { 
      byte[] buffer = new byte[1024]; 
      while(true) { 
       int bytesRead = reader.Read(buffer, 0, buffer.Length); 
       if(bytesRead == 0) { 
        break; 
       } 
       stream.Write(buffer, 0, bytesRead); 
      } 
     } 
    } 

    HttpWebResponse result = (HttpWebResponse)request.GetResponse(); 
    //handle result - not relevant 
} 

ve Write() ile bir istisna atar: istemci aşağıdaki kodu çalıştırır "taşıma bağlantısına veri yazılamıyor. Kurulan bir bağlantı, ana makinenizdeki yazılım tarafından iptal edildi" Metin. System.Net tracing'u kullandım ve Content-Length setini kullanarak isteği gönderdiğimde bir şeyin ters gittiğini fark ettim. Ben sunucuya Yukarıdaki kodda using deyimi içinde olan her şeyi atlarsanız

Özellikle derhal WWW-Authenticate ile yanıtlar ve daha sonra müşteri WWW-Authenticate ile isteği reposts ve her şey yüklemedi dosyanın haricinde gayet gider ve istek çok daha sonra başarısız olur.

Aşağıdakileri yapmak istiyorum: veri olmadan bir istek gönderin, WWW-Authenticate bekleyin ve ardından WWW-Authenticate ve verileriyle tekrarlayın. Bu yüzden yukarıdaki kodu değiştirmeyi denedim: önce tüm parametreleri ayarlayın, ardından GetResponse()'u arayın, sonra gönderin, ancak ContentLength özelliğini ayarlamaya çalıştığımda "Bu özellik, yazma başladıktan sonra ayarlanamaz" şeklinde bir istisna atılır.

HttpWebRequest Yeniden kullanılamaz gibi görünüyor.

Bağlantıyı kapatmadan isteği yeniden göndermek için bunu nasıl kullanırım?

+0

Aynı problemim var. Eğer çözümü aldıysanız, lütfen bana yardımcı olacak değiştirilmiş yeni kodu sağlayın veya gösterin. – Herin

+0

@Herin: Kimlik doğrulamasını nonce ile kullanırsanız çözüm yok. Temel kimlik doğrulama gibi bir şey kullanırsanız, "Yetkilendirme" başlıklarını yalnızca "WWW-Authenticate" aşaması olmaması için ayarlayabilirsiniz. – sharptooth

+0

Ama 'stream.Write (buffer, 0, bytesRead)' satırında hata alıyorum, o zaman bunun çözümü nedir? Lütfen daha iyi anlayabilmem için değiştirilmiş kodunuzu sağlayabilir misiniz? Teşekkürler – Herin

cevap

16

İsteği yeniden kullanmazsınız - adından da anlaşılacağı gibi, bu bir istektir. Ancak, aynı ana bilgisayar için birden çok istek yayınlarsanız, .NET temel ağ bağlantısını varsayılan olarak yeniden kullanır. Eğer request.GetResponse tarafından döndürülen WebResponse imha etme ihtiyacını yapmak

Not - Aksi temel altyapı aslında onunla bitti bilmeyecektir ve bağlantıyı yeniden mümkün olmayacaktır.

(kenara, neden BinaryReader Kullandığınız bir gibi? Sadece doğrudan File.OpenRead tarafından döndürülen akışı kullanın.)

+0

WebResponse imha için kefil olabilirim. WebResponse'yi uygulamalardan birinde kullanmamıştım ve birkaç HttpWebRequests'i başlattığım için kötü bir bellek sızıntısı çekmişti. – jlafay

+0

Adil, ancak sorunumu çözmek için başka hangi mekanizmayı kullanabilirim - özellikle kimlik doğrulaması almam ve sonra aynı "WWW-Authenticate" i yeniden kullanmam gerekiyor mu? – sharptooth

+0

@sharptooth: Neden sadece yanıtı üstbilgiden alıp bir sonraki istekte kullanamazsınız. Neden aynı nesneyi tekrar kullanmanız gerektiğini düşünüyorsunuz? –

2

Jon Skeet cevabı yanı sıra, el ContentLength özelliğini ayarlamak gerekmez. HttpWebRequest otomatik olarak bu özelliği hesaplar ve doldurur.

İlgili konular