Мне нужна помощь в решении довольно странной ошибки в службе WCF - PullRequest
1 голос
/ 28 марта 2010

У меня есть решение, которое содержит три проекта. Основной проект с моим приложением MVC, приложением silverlight и сервисным проектом WCF (с поддержкой silverlight).

В моем проекте silverlight я сделал ссылку на сервис для моей службы WCF. И у меня это получилось.

В моей службе WCF у меня есть метод, который возвращает объект Book, который получил несколько случайных полей, таких как заголовок, дата и т. Д. В классе книги у меня есть поле ICollection, которое содержит список событий.

Класс книги сгенерирован с использованием платформы лица 4.0, и включена отложенная загрузка.

Если я в своем методе getBook (int id) возвращает книгу с не инициализированным полем событий, это работает как чудо.

Но если я инициализирую поле, я получаю эту ошибку.

The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.

У меня есть несколько идей, почему это происходит, и во время написания этого у меня просто есть еще одна.

  1. Служба wcf как-то выбросила ссылку на класс события. Это было бы очень странно, так как у меня есть ссылка между моим основным приложением mvc (с моделями) и моим сервисом WCF.

  2. Поскольку я включил отложенную загрузку в EF 4.0, я подозреваю, что это может быть причиной ошибки. Но я не уверен, почему это так, потому что я никоим образом не получаю доступ к этой области. Я мог понять, что, возможно, не смогу получить доступ к полю событий после того, как получу объект в своем приложении silverlight, так как связь между объектом книги и структурой сущностей как разорвана.

Я упоминал, что на моем экземпляре EF включена отложенная загрузка? И в брошенном исключении нет внутреннего исключения.

EDIT: Это (я думаю) исключение на сервере.


Базовое соединение было закрыто: соединение было неожиданно закрыто.

Трассировка стека серверов: в System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException (WebException webException, запрос HttpWebRequest, HttpAbortReason abortReason) в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (TimeSpan timeout) в System.ServiceModel.Channels.RequestChannel.Request (сообщение-сообщение, время ожидания TimeSpan) в System.ServiceModel.Dispatcher.RequestChannelBinder.Request (сообщение-сообщение, время ожидания TimeSpan) в System.ServiceModel.Channels.ServiceChannel.Call (строковое действие, логический односторонний режим, операция ProxyOperationRuntime, Object [] ins, Object [] outs, TimeSpan timeout) в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (метод IMethodCallMessageCall, операция ProxyOperationRuntime) в System.ServiceModel.Channels.ServiceChannelProxy.Invoke (сообщение IMessage)

Исключение переброшено в [0]: в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg) в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & msgData, тип Int32) на RemoteProvider.getTimeline (идентификатор Int32) at RemoteProviderClient.getTimeline (Int32 id)

Внутреннее исключение: Основное соединение было закрыто: соединение было неожиданно закрыто. в System.Net.HttpWebRequest.GetResponse () at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (TimeSpan timeout)


Спасибо заранее. Malte Baden Hansen

Ответы [ 2 ]

2 голосов
/ 28 марта 2010

Без дополнительной информации о вашей фактической структуре я могу рискнуть только предположением, но это предположение следующее:

ICollection

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

Превратите свою коллекцию ICollection в список или массив, и вы, вероятно, будете в порядке.

Проблема возникает при десериализации входящих данных.Фреймворк пытается создать интерфейс, который он не может сделать, поэтому он раздражает.Существуют атрибуты , которые позволяют сопоставить интерфейс с конкретным типом, который WCF может создавать, но они неясны и трудны (IMO) для удобного использования.

0 голосов
/ 28 марта 2010

Это может быть проблемой сериализации.

Возможно, ICollection не может быть сериализован или ваш объект событий не помечен как сериализуемый. Чтобы это исправить:

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