«System.ServiceModel.CommunicationException» при попытке передать растровое изображение через WCF - PullRequest
2 голосов
/ 15 апреля 2011

Я пытаюсь передать растровое изображение через WCF, но оно выдает

System.ServiceModel.CommunicationException не было обработано кодом пользователя
Сообщение = Соединение с сокетом было прервано.Это может быть вызвано ошибкой при обработке вашего сообщения или превышением тайм-аута приема удаленным хостом, или проблемой основного сетевого ресурса.Тайм-аут локального сокета был '00: 00: 59.9650000 '.

Есть идеи, что может быть причиной этого?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 15 апреля 2011

Причина в том, что тип Bitmap является специфическим типом .NET (с большим количеством спецификаций Win32 внутри него), который нельзя сериализовать в XML. Вы не можете действительно передать его обратно в качестве параметра метода - то, что вы могли бы сделать, это передать его обратно параметру типа Stream и использовать потоковую передачу в WCF .

Или другим способом (если ваши растровые изображения не слишком велики) было бы преобразовать Bitmap в строку с использованием кодировки Base64, отправить его обратно в виде строки, а затем перекодировать на стороне клиента.

2 голосов
/ 15 апреля 2011

Предполагая, что вы размещаете свой сервис WCF в IIS (вы не упомянули никаких подробностей).

Попробуйте увеличить некоторые числа в конфигурационных файлах клиента и сервера (помните, что настройки должны совпадать).

<binding name="Binding_ISomeervice" closeTimeout="00:01:00"
    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
    transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
    hostNameComparisonMode="StrongWildcard" listenBacklog="1000"
    maxBufferPoolSize="524288" maxBufferSize="2147483647" maxConnections="100"
    maxReceivedMessageSize="2147483647">
  <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="2147483647"
    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binding>

Также включите отладку в файле веб-конфигурации сервера:

<system.web>
  <compilation debug="true" />
</system.web>

Если вы можете, поместите try / catch (с ведением журнала) вокруг вашей реализации вызова службы, это сообщит вам, если ваша реализация отбрасывает или среда размещения выбрасывает.

1 голос
/ 15 апреля 2011

Хех, это одно из самых раздражающих сообщений от WCF.Я думаю, что размер сообщения слишком велик.Самый надежный способ выяснить это - использовать трассировку WCF, как описано в http://msdn.microsoft.com/en-us/library/ms733025.aspx и SvcTraceViewer.exe.

0 голосов
/ 17 апреля 2011

Мой ответ состоит из двух частей: рекомендации для этой ситуации и рекомендации по улучшению отчетов об ошибках и отслеживанию на будущее.

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

CommunicationException является обобщенным и не раскрывает основное исключение. В будущем, при сообщении об ошибках, я бы рекомендовал включить IncludeExceptionDetailInFaults (либо из ServiceBehaviorAttribute, либо из поведения конфигурации) на сервере, чтобы отправить информацию об исключении обратно клиенту, а затем сообщить о вложенном исключении, которое вы получите подробно. .

Например:

<behaviors> 
            <serviceBehaviors> 
                <behavior 
                    <serviceMetadata httpGetEnabled="true" /> 
                    <serviceDebug includeExceptionDetailInFaults="true" /> 
                </behavior> 
            </serviceBehaviors> 
        </behaviors> 

Что касается включения трассировки, ниже приведен мой совет, который я уже вставил в несколько других ответов.

Как правило, после того, как вы это сделаете, вам нужно будет больше информации о том, что происходит на стороне службы, и можно довольно быстро диагностировать проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...