2011-06-20 99 views
2

我需要爲上傳大型文件創建WCF REST服務。我使端點成爲流式webHttpBinding,但它沒有變成流式傳輸。流式webHttpBinding未流式處理

服務示例:

[ServiceContract] 
public interface IFiles 
{ 
    [OperationContract] 
    void UploadFile(Stream stream); 
} 

public class Files : IFiles 
{ 
    public void UploadFile(Stream stream) 
    { 
     const int BUFFER_SIZE = 64 * 1024; 
     byte[] buffer = new byte[BUFFER_SIZE]; 

     using (TextWriter logWriter = new StreamWriter("d:\\UploadedFile.log")) 
     using (Stream fileStream = new FileStream("d:\\UploadedFile", System.IO.FileMode.Create, System.IO.FileAccess.Write)) 
     { 
      int readBytes = 0; 
      while (0 < (readBytes = stream.Read(buffer, 0, BUFFER_SIZE))) 
      { 
       fileStream.Write(buffer, 0, readBytes); 
       logWriter.WriteLine("{0}: {1} bytes saved", DateTime.Now, readBytes); 
      } 
     } 
    } 
} 

的Web.config:

<?xml version="1.0"?> 
<configuration> 

    <system.serviceModel> 
    <bindings> 
     <webHttpBinding> 
     <binding name="WebHttpBinding" maxBufferSize="65536" maxBufferPoolSize="524288" 
      maxReceivedMessageSize="1073741824" transferMode="Streamed" /> 
     </webHttpBinding> 
    </bindings> 
    <services> 
     <service name="WcfService2.Files"> 
     <endpoint behaviorConfiguration="WebHttpBehavior" binding="webHttpBinding" 
      bindingConfiguration="WebHttpBinding" name="Files" contract="WcfService2.IFiles" /> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="WebHttpBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="MyServiceBehavior"> 
      <serviceMetadata /> 
      <serviceDebug /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
    <system.web> 
    <httpRuntime maxRequestLength="500000" /> 
    </system.web> 

</configuration> 

客戶機代碼:

using (Stream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlString); 
    request.Method = "POST"; 
    request.ContentType = "application/octet-stream"; 
    //request.ContentLength = fileStream.Length; 
    //request.AllowWriteStreamBuffering = false; 
    request.SendChunked = true; 
    Stream requestStream = request.GetRequestStream(); 

    const int BUFFER_SIZE = 32 * 1024; 
    byte[] buffer = new byte[BUFFER_SIZE]; 
    int readBytes = 0; 
    while (0 < (readBytes = fileStream.Read(buffer, 0, BUFFER_SIZE))) 
    { 
     requestStream.Write(buffer, 0, readBytes); 
     Console.WriteLine("{0}: {1} bytes sent", DateTime.Now, readBytes); 
     System.Threading.Thread.Sleep(200); 
    } 
    requestStream.Close(); 

    WebResponse response = request.GetResponse(); 
} 

代碼方法的UploadFile僅requestStream.Close(之後調用)被調用。爲什麼?

回答

0

如果你想發送的部分,你應該在while循環requestStream.Write後添加的flush()

requestStream.Flush(); 

這是因爲流可以緩存輸出,直到它的nessecary發送它。見http://msdn.microsoft.com/en-us/library/system.io.stream.flush.aspx

+0

謝謝你的答案,但不幸的是,它不工作。我在requestStream.Write()之後的while循環中添加了requestStream.Flush(),並且只有在調用requestStream.Close()後才調用UploadFile。 – vpp