В настоящее время я борюсь с реализацией загрузки файлов в службу 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://localhost:/Service1.svc/UploadFile".
Служба REST WCF имеет метод со следующей подписью:
[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()
- «Невозможно записать данные в транспортное соединение: существующее соединение было принудительно закрыто удаленным хостом».
Так что для меня это выглядит как данные файла, которые я пытаюсьпоток в запрос просто не отображается на параметр метода сервера. Что я делаю не так?