WCF传输实体!!!!!!!!!!!!!!!!!!!!!!!!!!!

js1722 2009-03-13 09:18:52
目的是将客户端的泛型实体转为List<object>,传输到WCF服务端,再由WCF服务端对List<object>里的每个object对象进行序列化操作,然后存入数据库. 但是在WCF服务端进行序列化操作时,报错.. 客户端的实体对象都加了DataContract字段也加了DataMember. 错误提示为:进行序列化时出错:消息是数据协定名称"****"不是所需的类型.请将未知的类型以静态方式添加到已知类型的列表. 有遇到过这种情况吗?
...全文
1193 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycsno1 2009-03-14
  • 打赏
  • 举报
回复
一般这种情况应该是有两种解决办法,
1.把实体放到服务器端,在客户端引用就可以了!(我不知道这样是否会对楼主的客户端程序有影响!)
2.实体在服务器有,在客户端也有,需要用的时候写方法自己转换一下!
不同情况用不同方法,看楼主的具体需求了!
hubofly 2009-03-14
  • 打赏
  • 举报
回复
List 好像是有问题的
我用wcf的时候 用的是IEnumerable来传输的
例如
[DataMember]
public IEnumerable<object> array;
object 为制定类型的对象,我一般传输的时候都是确定object的对象类型的

然后就是一个数组对象了,基本没遇到过
js1722 2009-03-13
  • 打赏
  • 举报
回复
OK. 我工作不能用QQ,你加我的MSN或SKYPE吧~ 我的MSN:jiangsun_@hotmail.com skype:jiangsun210
js1722 2009-03-13
  • 打赏
  • 举报
回复
OK. 我工作不能用QQ,你加我的MSN或SKYPE吧~ 我的MSN:jiangsun_@hotmail.com skype:jiangsun210
  • 打赏
  • 举报
回复
DataContractSerializer ,它有?

最近准备学些下silverlight,呵呵,有机会多交流,我的qq:261882714
js1722 2009-03-13
  • 打赏
  • 举报
回复
它的客户端只装2,3MB的文件就可以运行了。
js1722 2009-03-13
  • 打赏
  • 举报
回复
它的客户端只装2,3MB的文件就可以运行了。
js1722 2009-03-13
  • 打赏
  • 举报
回复
诶~ 不行的. . 好象就它SDK包里面那些,毕竟现在还没出正式版.
  • 打赏
  • 举报
回复
那么说它的客户端环境还是支持v.net的dll的了,那就无所谓支持的组件少了,反正少什么就直接添加dll引用不就可以了,嘿嘿。
js1722 2009-03-13
  • 打赏
  • 举报
回复
DataContractSerializer ..
silverlight里面支持的组件还是太少了,
  • 打赏
  • 举报
回复
呵呵,用什么序列化的?
js1722 2009-03-13
  • 打赏
  • 举报
回复
OK. 传普通的实体对象已经搞定了,再客户端序列化了再传递过去。 silverlight和WCF,连List<>都不通用. 再研究下怎么把控件序列化.
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 js1722 的回复:]
客户端是用silverlight做的,在这里面没有找到序列化的相关程序集,再仔细研究下...
[/Quote]

呵呵,难道你在程序里易用system.servicemodel.dll不能用?这个只不过是一个dll罢了,里面的序列化类并不依赖具体的环境的

对于silverlight还在了解阶段,是不是引用了这个dll,它在客户端的环境会不支持,或者无法对这个dll不能打包?
vrhero 2009-03-13
  • 打赏
  • 举报
回复
既然协定是由服务端定义的...ServiceKnownType类型当然是必须在服务端声明的...

客户端是不需要声明实体类型的,客户端类型是根据服务端类型生成的...
js1722 2009-03-13
  • 打赏
  • 举报
回复
客户端是用silverlight做的,在这里面没有找到序列化的相关程序集,再仔细研究下...
  • 打赏
  • 举报
回复
呵呵,以前也做过类似的
如果你的所有实体都被标注了datacontract,和datamember

建议你可以自己预先序列化成字符串,然后你的wcf通讯接口只有一个方法,就是传递你序列化的字符串,然后在服务端反序列化回来。因为如果你传一个明确的对象,它也是要去做序列化的,你如果自己做 了,它就不会去做了。用Datacontractserilizer,它就是用的这个,这个只要你标注了datacontract和datamember速度是非常快,也不怎么耗cpu。
js1722 2009-03-13
  • 打赏
  • 举报
回复
谢谢楼上二位. 我的实体是放在客户端的,刚测了一下,添加了[KnownType(typeof(**))]属性. 还是不行. 是否需要把实体加在服务端申明呢?
但是客户端很多地方都用到了此实体.
WizardWu 2009-03-13
  • 打赏
  • 举报
回复
Web Service,有时候为了图方便,会想要直接传递 object 类型的变量回到前端,是可以成功的,不过在 WCF 中,由于它要求所有在 WCF 数据流中通讯的对象数据都必须要有一个明确的类型,以利 WCF 的序列化与反序列化用,因此它无法传递 object 这种未知类型的对象,所以 WCF 在预设情况下,只能够传递由数据合约 (Data Contract) 所描述的对象 (此即已知类型问题,是一种由开发团队所设计的行为)。
不过,如果你认定该 object 代表的类型的话,你就必须要在数据合约中加上 KnownTypeAttribute 宣告,让 WCF 的序列化引擎可以把 KnownTypeAttribute 所定义的型别当做 object 的默认类型,如此就可以在资料合约中使用 object 类型的数据了。

[DataContract]
[KnownType(typeof(UserAccount))]
public class Response
{

   [DataMember]
   public string ResponseText;

   [DataMember]
   public bool CompletedSuccesfully;

   [DataMember]
   public object ResponseObject;

}
vrhero 2009-03-13
  • 打赏
  • 举报
回复
所有传输的实体对象类型都必须是已知的...必须在协定中声明这些类型...

用ServiceKnownType属性声明...
Microsoft .NET Framework 3.5 Service Pack 1 是一个累积更新,包含很多基于 .NET Framework 2.0、3.0 和 3.5 不断生成的新功能,此外还包括 .NET Framework 2.0 Service Pack 2 和 .NET Framework 3.0 Service Pack 2 累积更新。 .NET Framework 3.5 Service Pack 1 版提供了以下新功能和改进: ASP.NET 动态数据,它提供了丰富的框架,从而使用户可以快速进行数据驱动的开发,而无需编写代码;ASP.NET AJAX 的一项新增功能,对管理浏览器历史记录提供了支持(支持后退按钮)。有关更多信息,请参见 What’s New in ASP.NET and Web Development(ASP.NET 和 Web 开发中的新增功能)。 对公共语言运行时的核心改进包括:改进了 .NET Framework 本机映像的布局、选择不再对完全受信任的程序集进行强名称验证、提高了应用程序启动性能、改进了生成的代码以缩短端对端应用程序执行时间、选择在 ASLR(地址空间布局随机化)模式下运行托管代码(如果操作系统支持)。此外,从网络共享打开的托管应用程序在完全受信任环境下运行时与本机应用程序具有相同的行为。 提高了 Windows Presentation Foundation 的性能,包括缩短了启动时间,提高了与位图效果有关的性能。WPF 的其他新增功能包括:改善了对业务线应用程序、本机初始屏幕、DirectX 像素着色器的支持,并且新增了 WebBrowser 控件。 ClickOnce 应用程序发行者可以决定在适当情况下不进行签名和加密,开发人员可以编程方式安装 ClickOnce 应用程序以显示自定义署名,并且 ClickOnce 错误对话框支持链接到 Web 上应用程序特定的支持网站。 实体框架是从现有的一套 ADO.NET 数据访问技术发展而来的。利用实体框架,开发人员可以按照应用程序特定的域模型(而不是基础数据库模型)来针对关系数据库进行编程。有关更多信息,请参见 Getting Started with the Entity Framework(实体框架入门)。实体框架还引入了一些其他功能,包括支持 SQL Server 2008 的新类型、默认实体图形序列化和实体数据源。在此版本中,实体框架支持 SQL Server 2008 中的新日期和文件流功能。图形序列化工作可帮助开发人员生成将全部图形建模为数据协定的 Windows Communication Foundation (WCF) 服务。实体数据源为希望使用实体框架的 ASP.NET 应用程序构建者提供了传统的数据源体验。 LINQ to SQL 新增了对 SQL Server 2008 中的新日期和文件流功能的支持。 ADO.NET Data Services Framework 由满足以下条件的模式和库组合而成:支持将数据公开为一项基于 REST(具象状态传输)的灵活数据服务,企业网络内部或整个 Internet 上的 Web 客户端都可以使用该服务。ADO.NET Data Services Framework 支持基于任何数据源创建数据服务。通过与 ADO.NET Entity Framework 的充分集成,可以轻松公开基础存储架构的概念视图模型。可以轻松地从任一平台访问使用 ADO.NET Data Services Framework 创建的服务以及兼容的 Windows Live (dev.live.com) 服务。针对运行在 Microsoft 平台上的客户端应用程序提供了一组客户端库,以简化与数据服务的交互。例如,基于 .NET Framework 的客户端可以使用 LINQ 查询数据服务,也可以使用简单的 .NET Framework 对象层更新此服务中的数据。 现在,Windows Communication Foundation 改进了对互操作性的支持,增强了部分受信任情况下的调试体验,并且扩展了整合协议支持以便在 Web 2.0 应用程序中可以进行更广泛的应用,从而使 DataContract 序列化程序变得更易于使用。 用于 SQL Server (SqlClient) 的 .NET Framework 数据提供程序新增了对 SQL Server 2008 中的文件流和稀疏列功能的支持。
基于EF+MVC+Bootstrap的通用管理系统。 Framework 业务无关的底层通用机制及功能 Model基类:提供数据传输和底层的最基本的基类及接口 DAL底层:基于EF code first,提供Repository泛型方法及写历史日志 Untility:通用函数库,基本都全了 Web:复写MVC基类,及通用MVC控件 通用模块Core 核心功能模块,包括缓存管理,配置管理,日志管理,服务管理...... 缓存模块:提供对分布式缓存的Provider扩展 配置模块:基于正则的配置管理及CURD机制 日志模块:基于Log4net扩展 服务模块:默认使用引用Bll,可扩张调用Wcf服务,且拦截服务 上传模块:通用upload handler,及缩略图生成方式(按需生成,即时生成,延迟生成) 管道模块:通用HttpModule,用于注入通用功能到各个应用及网站 应用模块三层架构 提供OA,CMS,CRM系统的原型及DAL,IBLL及BLL实现 Account:用户认证,可自己扩张到SSO单点登录 Account: 安全验证码实现 Account: 轻量级权限系统 OA:提供OA里人员,部门管理及分配的场景实例 CRM:客户管理系统原型 CMS:内容发布系统原型 数据层(DAL): 采用Code first POCO方式 提供实体设计:一对一,一对多,多对多,自引用的各种使用场景 业务逻辑层(BLL): 实现CURD方法 提供复杂查询场景 提供业务异常抛出 对后端异常进行拦截写日志 对写操作进行写历史,用于追踪 IBLL: 服务接口,可扩展用WCF发布BLL作为服务 前端框架及实现 MVC,Bootstrap.......... 基于Bootstrap:基于“Metronic Bootstrap Theme”模板 MVC 4.0:CURD操作基于MVC Model Binder Silverlight 5:OA里组织图OrgChart拖拽操作 封装Context:封装ConfigContext,CacheContext,UserContext,CookieContext.. 上传控件:Uploadify使用实例 Jquery:除Metronic模板在Assets文件夹,Content文件夹加入需要的Jquery插件 提供富文本编辑器,标签,JS曲线图等实例 一款采用C#开发的源码,功能完整,界面美观,欢迎大家下载。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧