(Закрыто) WCF со словарем - PullRequest
       7

(Закрыто) WCF со словарем

0 голосов
/ 31 января 2012

Я нашел свою ошибку.Я использую NHibernate ленивая загрузка.И сериализатор не может сериализовать RoleProxy.

Как получить объект с полем Dictionary из службы WCF?Когда я пытаюсь это сделать, я получаю следующее исключение:

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

Трассировка стека:

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

исключительное время восстановления:Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg) в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (тип MessageData & msgData, Int32) в UserManagmentStudio.DataService.IDataererService.GataTerviceServiceServiceServiceServiceServiceService ()) в C: \ Users \ d.kolpakov \ documents \ visual studio 2010 \ Projects \ UserManagmentStudio \ UserManagmentStudio \ Ссылки на службы \ DataService \ Reference.cs: строка 64 в UserManagmentStudio.Controllers.UsersController.Index (фильтр UserFilter, String dataType) вC: \ Users \ d.kolpakov \ documents \ visual studio 2010 \ Projects \ UserManagmentStudio \ UserManagmentStudio \ Controllers \ UsersController.cs: строка 29 в lambda_method (закрытие, ControllerBase, Object []) вSystem.Web.Mvc.ActionMethodDispatcher.Execute (контроллер ControllerBase, параметры Object []) в System.Web.Mvc.ReflectedActionDescriptor.Execute (параметры ControllerContext controllerContext, IDictionary 2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2) в System.Web.Mvc.ControllerActionInvoker.>c_ DisplayClass15.b _12 () в System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter (фильтр IActionFilter, ActionExecutingContext preContext, продолжение Func`1)

Сервисный интерфейс:

1022 *

User.cs:

   [DataContract(IsReference = true)]
    public class User : IValidatableObject
    {
        [DataMember]
        private readonly IDictionary<Role,AccessLevel> roles = new Dictionary<Role,AccessLevel>();

        public virtual IDictionary<Role,AccessLevel> Roles
        {
            get { return roles; }
        }

.....

    }

Role.cs:

[DataContract(IsReference = true)]


       public class Role
        {
    private readonly IDictionary<User, AccessLevel> users = new Dictionary<User, AccessLevel>();

            [DataMember]
            public virtual Int32 Id { get; set; }

            [DataMember]
            public virtual String Name { get; set; }

            public virtual IDictionary<User,AccessLevel> Users
            {
                get { return users; }
            }
    }

AccessLevel.cs:

   [DataContract(IsReference = true)]
    public class AccessLevel
    {
        [DataMember]
        public virtual Int32 Id { get; set; }

        [DataMember]
        public virtual String Value { get; set; }
    }

Ответы [ 3 ]

3 голосов
/ 31 января 2012

Попробуйте изменить IDictionary на свойство словаря для чтения и записи. В контракте данных вы должны указать реализацию, иначе десериализатор не знает, как создать объект, я думаю

1 голос
/ 31 января 2012
[DataContract]
    public class User : IValidatableObject
    {
        [DataMember]
        public Dictionary<Role,AccessLevel> Roles
        {
            get; set;
        }
    }

[DataContract]       
public class Role
     {           
        [DataMember]
        public Int32 Id { get; set; }

        [DataMember]
        public String Name { get; set; }

        [DataMember]
        public Dictionary<User,AccessLevel> Users
        {
           get;set;
       }
}
0 голосов
/ 31 января 2012

Переменные только для чтения не могут быть переданы / сформированы службой, так как они не сериализуемы. поэтому вы должны добавить набор для свойства User.Roles.

...