WCF большая передача файлов с сервера и наоборот - PullRequest
2 голосов
/ 19 августа 2010

Мой сервисный контракт WCF имеет следующие методы:

    [OperationContract]
    string GetFile(int id);

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

GetFile возвращает текст файла, а UploadFile отправляет некоторый контент файла на сервер.

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

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

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

Ответы [ 2 ]

2 голосов
/ 19 августа 2010

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

1 голос
/ 19 августа 2010

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

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

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

...