2010-10-15 48 views
1

我發送一個來自WinForms應用程序的HTTP PUT請求,我想發送一個緩慢的PUT數據到PUT數據到PUT數據時將消息寫入數據庫的頁面。我使用WebRequest並將SendChunked設置爲true,但似乎只有在將8KB數據寫入請求流後才發送一個塊。我可以告訴WebRequest何時從請求流中發送塊嗎?

更糟糕的是,網頁似乎在大約42KB後停止接收,並且發件人在大約77KB後發出WebException,並顯示消息「請求已中止:請求已被取消」。我實際上在每條消息中發送非常少量的數據,所以如果我能說服WebRequest發送一個包含每條消息的小塊,我會沒事的。

這裏就是我與迄今爲止的實驗:

 var request = 
      (HttpWebRequest)WebRequest.Create("http://localhost/test.php"); 

     request.Method = "PUT"; 
     request.Timeout = 300 * 1000; 
     request.SendChunked = true; 
     request.AllowWriteStreamBuffering = false; 
     request.ContentType = "application/octet-stream"; 
     using (var post = new StreamWriter(request.GetRequestStream())) 
     { 
      post.AutoFlush = true; 
      for (int i = 0; i < 100; i++) 
      { 
       if (i > 0) 
       { 
        // force flushing previous chunk 
        post.Write(new String(' ', 1048)); 
        Thread.Sleep(2 * 1000); 
       } 
       Console.Out.WriteLine("Requesting {0} at {1}.", i, DateTime.Now); 
       string chunk = i.ToString(); 
       post.WriteLine(i); 
      } 
     } 

我寫的空白1KB每條消息後,試圖迫使WebRequest的發送塊越快。

回答

1

如果我正確理解你的問題,你想發出一個PUT請求。作爲請求的一部分,您希望發送分塊數據,並且希望服務器對其看到的每個塊執行操作。

我不認爲這將很容易通過使用HttpWebRequest可能。正如你已經注意到的那樣,雖然HWR將發送分塊的數據,但它不能控制塊的開始和結束的確切位置。接下來,即使你可以脫離客戶端,通過按照Don的建議編寫一個自定義的Socket實現,你仍然不能保證web服務器將控制你的應用程序的每個塊,它接收。網絡服務器可能會決定緩衝幾塊,並同時將它們全部提供給應用程序。

我建議你重新考慮你的設計,並且有一個簡單的基於請求/響應的模型,其中請求+數據構成服務器需要採取的行動。

1

如果沒有人有更優雅的建議,我想我可以打開原始套接字並自己實現分塊編碼。在this answer中有一個合理的描述。

相關問題