Данные, отправленные в службу WCF REST, не попадают во входной параметр Stream - PullRequest
0 голосов
/ 20 января 2011

В настоящее время я борюсь с реализацией загрузки файлов в службу 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() - «Невозможно записать данные в транспортное соединение: существующее соединение было принудительно закрыто удаленным хостом».

Так что для меня это выглядит как данные файла, которые я пытаюсьпоток в запрос просто не отображается на параметр метода сервера. Что я делаю не так?

1 Ответ

0 голосов
/ 20 января 2011

возможно попробовать другой тип контента?"application / octet-stream"

Код выглядит мне правильно.Клиентская часть читает весь файл или у него есть проблемы?Проверьте это первым.Используйте fiddler, чтобы увидеть, что на самом деле происходит по проводам к сервису.

Если клиент может прочитать весь файл в буфер, попробуйте отправить его все сразу

request.Write (wholeFileBuffer, 0, wholeFileLength);request.close ();

вместо разбиения на части.

...