2009-12-08 9 views
5

Arka plan - C# içinde HttpWebRequest/HttpWebResponse kullanarak, mevcut bir web sayfasını ayrı bir web uygulamasına aktarmaya çalışıyorum. Çarpıştığım bir konu, dosya yükleme isteği içerik uzunluğunu kullanarak dosya yükleme isteği içerik uzunluğunu ayarlamaya çalışmamdır. HOWPWebResponse'nin kaynak web sayfası bir web sunucusu üzerinde olduğunda, sorun HOW bir içerik uzunluğu sağlar.Herhangi bir kullanıcı doğrudan bir web sunucusuna yükleme yapmak için "yığınlanmış" HTTP akışını bir web doğrudan indirme yapmak için örnek kod var mı?

HttpWebRequest downloadRequest = WebRequest.Create(new Uri("downloaduri")) as HttpWebRequest; 
using (HttpWebResponse downloadResponse = downloadRequest.GetResponse() as HttpWebResponse) 
{ 
    var uploadRequest = (HttpWebRequest) WebRequest.Create(new Uri("uripath")); 
    uploadRequest.Method = "POST"; 
    uploadRequest.ContentLength = downloadResponse.ContentLength; // #### 

SORU: I (indirme tepkisi bir içerik uzunlukta kümesi sahip olmadığında) Bu durumda karşılamak üzere bu yaklaşımı güncelleme olabilir nasıl. Bir şekilde bir MemoryStream kullanmak olabilir mi? Herhangi bir örnek kod takdir edilecektir. Özellikle bir içerik örneklemini sağlamayan kaynak web sunucusunun herhangi bir sorununu önlemek için bir "yığın" HTTP indirme & yükleme nasıl yapacağını gösteren bir kod örneği var mı? Zaten Microsoft Forumlar uygulanan gibi

Teşekkür

cevap

5

, ne tür seçeneklere sahip bir çift vardır.

Ancak bu bir MemoryStream ile bunu görecektir: Ayrıca

HttpWebRequest downloadRequest = WebRequest.Create(new Uri("downloaduri")) as HttpWebRequest; 

byte [] buffer = new byte[4096]; 
using (MemoryStream ms = new MemoryStream()) 
using (HttpWebResponse downloadResponse = downloadRequest.GetResponse() as HttpWebResponse) 
{ 
    Stream respStream = downloadResponse.GetResponseStream(); 
    int read = respStream.Read(buffer, 0, buffer.Length); 

    while(read > 0) 
    { 
     ms.Write(buffer, 0, read); 
     read = respStream.Read(buffer, 0, buffer.Length); 
    } 

    // get the data of the stream 
    byte [] uploadData = ms.ToArray(); 

    var uploadRequest = (HttpWebRequest) WebRequest.Create(new Uri("uripath")); 
    uploadRequest.Method = "POST"; 
    uploadRequest.ContentLength = uploadData.Length; 

    // you know what to do after this.... 
} 

, gerçekten ContentLength önsel için değer bilmenin dert etmenize gerek yok unutmayın. Tahmin ettiğiniz gibi SendChunked, uploadRequest numaralı telefona kodunu ayarlayabilir ve ardından indirme akışından yükleme akışına kopyalayabilirsiniz. Ya da, kopyayı chunked ayarını yapmadan ve HttpWebRequest (bildiğim kadarıyla) veriyi dahili olarak arabelleyebilirsiniz (AllowWriteStreamBuffering'un trueuploadrequest'a ayarlandığından emin olun) ve içerik uzunluğunu belirleyip isteği gönderin.

+0

mükemmel - sadece dışarı çıktım ama geri döndüğümde geçeceğim ... – Greg

İlgili konular