2010-08-19 4 views
2
контракт на обслуживание

Мой WCF должен методы, подобные этим:WCF передачи больших файлов с сервера и наоборот

[OperationContract] 
    string GetFile(int id); 

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

GetFile возвращает текст в файл и UploadFile отправляет содержимое какой-либо файл на сервере.

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

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

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

+0

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

+0

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

ответ

2

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

+0

именно то, что я собирался предложить! – BerggreenDK

1

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

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

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

+0

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

+0

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