【问题标题】:(Closed)WCF with Dictionary(已关闭)带字典的 WCF
【发布时间】:2012-02-23 02:20:26
【问题描述】:

我发现了我的错误。我使用 NHibernate 延迟加载。而且序列化器无法序列化 RoleProxy。

如何从 WCF 服务获取带有 Dictionary 字段的对象? 当我尝试这样做时,我得到了这个异常:

底层连接已关闭:连接已关闭 没想到。

堆栈跟踪:

服务器堆栈跟踪:在 System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest 请求, HttpAbortReason abortReason)
在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(时间跨度 超时)在 System.ServiceModel.Channels.RequestChannel.Request(消息消息, TimeSpan 超时)在 System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息 消息,TimeSpan 超时)在 System.ServiceModel.Channels.ServiceChannel.Call(字符串动作, Boolean oneway, ProxyOperationRuntime 操作, Object[] ins, Object[] 出局,TimeSpan 超时)在 System.ServiceModel.Channels.ServiceChannel.Call(字符串动作, Boolean oneway, ProxyOperationRuntime 操作, Object[] ins, 对象 [] 出局)在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime 操作)在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 留言)

在 [0] 处重新抛出异常:在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(消息数据& msgData,Int32 类型)在 UserManagmentStudio.DataService.IDataService.GetUser() 在 UserManagmentStudio.DataService.DataServiceClient.GetUser() 在 C:\Users\d.kolpakov\documents\visual studio 2010\项目\用户管理工作室\用户管理工作室\服务 References\DataService\Reference.cs:第 64 行,位于 UserManagmentStudio.Controllers.UsersController.Index(UserFilter 过滤器,字符串数据类型)在 C:\Users\d.kolpakov\documents\visual 工作室 2010\Projects\UserManagmentStudio\UserManagmentStudio\Controllers\UsersController.cs:line 29 at lambda_method(Closure, ControllerBase, Object[]) at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase 控制器,对象 [] 参数)在 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext 控制器上下文,IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 参数)在 System.Web.Mvc.ControllerActionInvoker.c_DisplayClass15.b_12() 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 过滤器、ActionExecutingContext preContext、Func`1 延续)

服务接口:

  [ServiceContract]
    public interface IDataService
    {
        [OperationContract]
        User GetUser();
    }

用户.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; }
        }

.....

    }

角色.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; }
    }

【问题讨论】:

标签: c# wcf model-view-controller serialization deserialization


【解决方案1】:

只读变量不能传递给/形成服务,因为它们不可序列化。所以你应该为User.Roles属性添加一个集合。

【讨论】:

    【解决方案2】:
    [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;
           }
    }
    

    【讨论】:

    • 我刚刚注意到您的用户有角色,而您的角色也有用户。如果可能,删除循环定义。类似问题:devblog.petrellyn.com/?p=278
    【解决方案3】:

    尝试将 IDictionary 更改为可读写的 Dictionary 属性。在数据契约中你必须指定一个实现,否则反序列化器不知道如何构造对象,我认为

    【讨论】:

      猜你喜欢
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      相关资源
      最近更新 更多