Передача больших файлов WCF с сервера и наоборот

#wcf #file #transfer

#wcf #файл #передача

Вопрос:

Мой контракт на обслуживание WCF должен использовать такие методы:

     [OperationContract]
    string GetFile(int id);

    [OperationContract]
    void UploadFile(int id, string text);
  

GetFile возвращает текст файла, а uploadFile отправляет содержимое некоторого файла на сервер.

Наблюдается странное поведение, когда размер файла составляет около нескольких МБ (в моем случае 4,37 МБ): GetFile работает нормально, и клиент получает длинный текст без каких-либо проблем, но uploadFile не может отправить тот же файл на сервер. Клиент зависает во время выполнения этого метода и, похоже, не собирается завершать операцию. Я ждал несколько минут, но результата не было, и я принудительно остановил клиент.

Итак, мой вопрос в том, есть ли какая-либо разница между направлениями такой передачи? Я знаю о потоковой передаче WCF, которую следует использовать для отправки больших файлов на сервер, и я собираюсь изменить свой код, используя ее. Интересно, почему проблема возникает только тогда, когда файл передается на сервер, в то время как сервер корректно возвращает данные того же размера?

Обновить. Загрузка файла не должна быть одноразовой операцией, потому что мне нужно знать, прошла ли она успешно. Выполнение не обогащает сервер. Я установил точку останова на стороне сервера, и она не срабатывает.

Комментарии:

1. Если хостинговое приложение отклоняет запрос, естественно, что ваша точка останова не достигнута.

2. Запрос не отклонен, он не доходит до сервера.

Ответ №1:

Я предполагаю, что вы уже настроили квоты maxReceivedMessageSize и reader как на сервере, так и на клиенте. В противном случае вы не сможете отправлять такие большие сообщения. Размещаете ли вы свою службу WCF в IIS? Среда выполнения Http имеет свой собственный лимит, который составляет 4 МБ. Это можно изменить в configuration/system.web/httpRuntime/@maxRequestLength (значение указано в КБ). Интересно, почему вы не получаете никаких исключений.

Комментарии:

1. именно это я и собирался предложить!

Ответ №2:

Возможно ли, что клиент просто ждет, когда UploadFile вернется?

Единственное, что вы могли бы сделать, это запустить вызов метода uploadFile в отдельном through, чтобы не блокировать поток пользовательского интерфейса (предполагая, что клиент, о котором вы говорите, является приложением с графическим интерфейсом).

Возможно, стоило бы установить для OperationContract из UploadFile значение [OperationContract(IsOneWay = true)] , чтобы клиент не ждал ответа сервера. Даже если возвращаемый тип UploadFile равен void, сервер все равно ответит пустым сообщением, если IsOneWay не установлено значение true. Однако, как упоминал Ладислав, это приводит к тому, что вы запускаете и забываете, и вы не узнаете, делает ли сервер исключение во время обработки вашего вызова.

Комментарии:

1. Но если вы установите IsOneWay= true, вы никогда не узнаете, была ли загрузка успешной.

2. @Ladislav — это правда, но часто вам на самом деле все равно, и вы просто хотите запустить и забыть, исходя из вопроса, который я не могу точно определить, отсюда и предложение. Следовало упомянуть об этом, хотя, я думаю, обновил свой ответ