提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
以前我用过wcf 服务,但是最近使用了新的vs 开发工具,遇到了一些问题,在这里记录下,不知道屏幕前的你是否也遇到了类似的问题。我们一起探讨一下。
一、使用vs2022如何添加服务引用?
按照上面的图操作,然后点击ok 就可以了。
但是要特别注意advanced 中的设置。以我现在的项目来讲,我的需求是已经存在的数据类型我想要共用,那么就需要对advance 中的设置进行设置了。
打开界面如下图,第一个选项,是否生成异步操作,这个比较好理解,就一笔带过了。
第二项DataType 中的Collection Type 的选择,默认是system.Array,其实服务端过来的数据是集合类型,那么你这里可以选择你真正想用的类型,如果你wpf 想要通知,那么你可以选用ObservableCollection 这种类型,自动生成好了之后,你可以去看看Reference.cs 文件中他自动生成的样子。
最后 图上的那个Reuse type in referenced assemblies 是问你是否重用类型,就是说你的代码中已有的类型,他不在自动给你生成新的类型了,如果不勾选,那么他会生成一个只有命名空间不同,其他一样的类型。
这里我要说一下,我遇到的问题,我选择了重用类型,但是某些类还是没有重用,直接生成新的。目前我还没有找到问题所在。后边我会贴出来我的相关代码。
二、遇到的问题
1.System.ServiceModel.ServiceKnownTypeAttribute 生成的位置不对
报错信息如下
Exception thrown: 'System.ServiceModel.Dispatcher.NetDispatcherFaultException' in mscorlib.dll
QueryDataService 服务异常
The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:GetDataResult.
The InnerException message was 'Element 'http://tempuri.org/:GetDataResult' contains data from a type that maps to the name 'http://schemas.datacontract.org/2004/07/Productive.Common.Platform:ArrayOfChamberSet'. The deserializer has no knowledge of any type that maps to this name.
Consider using a DataContractResolver if you are using DataContractSerializer or add the type corresponding to 'ArrayOfChamberSet' to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding it to the list of known types passed to the serializer.'. Please see InnerException for more details.
大致意思就是告诉你他不知道数据的类型。
解决办法就是自己去修改自动生成的Reference.cs 文件。希望看到我文章的大佬可以给我指点迷津。
2.项目中部分类无法重用,自动生成了这些类
比如这个类型FFUData 。
我项目引用了这个类型,但是生成wcf 的时候,又自动生成了新的类型,没有进行重用。
总结
以上就是我最近遇到的问题,记录下来,以防自己忘记。问题目前尚未解决。大家一起讨论下吧。看看是否有解决办法。