2011-01-20 90 views
0

我目前正在努力实现向WCF REST服务的文件上载。发送到WCF REST服务的数据不会转到流输入参数

客户端执行以下操作:

void uploadFile(string serverUrl, string filePath) 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest. 
     Create(serverUrl); 
    request.Method = "POST"; 
    request.ContentType = "multipart/form-data"; 
    request.SendChunked = true; 
    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 
} 

其中serverUrl为 “http://本地主机:/Service1.svc/UploadFile”。

的WCF REST服务具有以下签名的方法:

[OperationContract] 
[WebInvoke(Method="POST")] 
string UploadFile(System.IO.Stream fileData); 

这是实现如下:

public string UploadFile(System.IO.Stream fileData) 
{ 
    byte[] buffer = new byte[1024]; 
    while(true) { 
     int readAmount = fileData.Read(buffer, 0, buffer.Length); 
     if(readAmount == 0) { 
      break; 
     } 
    } 
    return ""; 
} 

当我启动服务并运行客户机代码将出现以下情况。

客户端启动while循环,控件进入服务方法,服务器启动while循环。服务器上的Read返回零,控件通过服务器方法返回。同时,客户端尝试拨打Write() - “无法将数据写入传输连接:现有连接被远程主机强行关闭”。

对我来说,它看起来像我试图流入请求的文件数据只是没有映射到服务器方法参数。我究竟做错了什么?

回答

0

可能尝试不同的内容类型? “application/octet-stream”

该代码看起来很适合我。客户端部分是读取整个文件还是有问题?先测试一下。使用fiddler来查看实际通过电话连接到服务的内容。

如果客户可以在整个文件到缓冲区中读取,再试一次

request.Write(entireFileBuffer,0,entireFileLength)发送这一切; request.close();

而不是分块。

+0

我尝试了所有这一切,但没有多大帮助。没有Fiddler它不起作用,客户端现在抛出一个异常“底层连接已关闭:接收发生意外错误”,请求到达服务器并且服务器行为与以前相同。使用Fiddler,我在客户端上获得HTTP 502 Bad Gateway,并且请求没有到达服务器,请求在提琴手中看起来合理。 – sharptooth 2011-01-21 13:57:27