我目前正在努力实现向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()
- “无法将数据写入传输连接:现有连接被远程主机强行关闭”。
对我来说,它看起来像我试图流入请求的文件数据只是没有映射到服务器方法参数。我究竟做错了什么?
我尝试了所有这一切,但没有多大帮助。没有Fiddler它不起作用,客户端现在抛出一个异常“底层连接已关闭:接收发生意外错误”,请求到达服务器并且服务器行为与以前相同。使用Fiddler,我在客户端上获得HTTP 502 Bad Gateway,并且请求没有到达服务器,请求在提琴手中看起来合理。 – sharptooth 2011-01-21 13:57:27