解决一个通过 WebReference 调用 WCF 时自定义 DataContract 类参数提交的问题
先看一下VS2013自动创建默认的IService1.vb,注意自定义的数据契约 CompositeType
' 注意: 使用上下文菜单上的“重命名”命令可以同时更改代码和配置文件中的接口名“IService1”。
<ServiceContract()>
Public Interface IService1 <OperationContract()>
Function GetData(ByVal value As Integer) As String <OperationContract()>
Function GetDataUsingDataContract(ByVal composite As CompositeType) As CompositeType ' TODO: 在此添加您的服务操作 End Interface ' 使用下面示例中说明的数据约定将复合类型添加到服务操作。 <DataContract()>
Public Class CompositeType <DataMember()>
Public Property BoolValue() As Boolean <DataMember()>
Public Property StringValue() As String End Class
通过添加 WebReference 引用后的客户端代码
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim wrClient As New localhost.Service1
Dim data As New localhost.CompositeType
data.BoolValue = True
'data.BoolValueSpecified = True
data.StringValue = "Hello world" Dim result As localhost.CompositeType = wrClient.GetDataUsingDataContract(data)
MessageBox.Show(result.StringValue)
End Sub
注意被注释掉的那一行,在没有显式地指定 data.BoolValueSpecified = True 的情况下,BoolValue 的值不会被客户端提交到服务端,服务端接收到的 data 参数中BoolValue 将赋值为其默认值(false)。
类似的还有服务契约中的参数如果不是String类型,则必须指定 [参数名]Specified = True,该参数才会被执行提交,如
<OperationContract()>
Function GetDataUsingBoolValue(ByVal boolValue As Boolean, ByVal StringValue As String) As String
对应的客户端调用代码
MessageBox.Show(wrClient.GetDataUsingBoolean(True, True, "Hello World"))
如果你打算客户端省点功夫,不想总是显式地设置 Specified = True, 那么在声明服务契约和数据契约时,就要多做一点工作
<ServiceContract()>
Public Interface IService1 <OperationContract()>
Function GetData(ByVal value As Integer) As String <OperationContract()>
Function GetDataUsingDataContract(ByVal composite As CompositeType) As CompositeType ' TODO: 在此添加您的服务操作 ''' <summary>
''' 存在非String类参数的方法
''' </summary>
''' <param name="boolValue"></param>
''' <param name="StringValue"></param>
''' <returns></returns>
''' <remarks>
''' 注意:DataContractFormat(Style:=OperationFormatStyle.Rpc)
''' 如果没有设置此属性,非String类的参数默认不会被提交,是否被提交将由 [非String类参数名]Specified 的取值决定
''' </remarks>
<OperationContract(), DataContractFormat(Style:=OperationFormatStyle.Rpc)>
Function GetDataUsingBoolValue(ByVal boolValue As Boolean, ByVal StringValue As String) As String
End Interface ' 使用下面示例中说明的数据约定将复合类型添加到服务操作。 <DataContract()>
Public Class CompositeType ''' <summary>
''' 非String类的参数
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks>
''' 注意:IsRequired:=True
''' 如果没有设置此属性,该参数默认不会被提交,是否被提交将由 BoolValueSpecified 的取值决定
''' </remarks>
<DataMember(IsRequired:=True)>
Public Property BoolValue() As Boolean <DataMember()>
Public Property StringValue() As String End Class
具体的解释,可以参见这里
今天为这个问题折腾了老半天,尤其是 DataContract 里面的 DataMember(IsRequired:=True) 藏得比较深,特别是在客户端通过 ServiceReference 引用的时候没有这个问题,到了用 WebReference 引用的时候,发现非String类型(如 Integer, Double, Single, DateTime等,不过 Byte数组除外)的参数死活提交不上去了。
立此存照,希望能帮到不小心掉进这个坑里的同行,:)
解决一个通过 WebReference 调用 WCF 时自定义 DataContract 类参数提交的问题的更多相关文章
- Python之Suds库调用WCF时复杂参数序列化
今天主要做自动化测技术支持工作,最近一直在做接口自动化这块,前些天在研究将web页面模拟http进行接口自动化,这周杭州那边想测试WCF服务,所以这两天一直在探索.遇到的第一个问题就是服务参数传参序列 ...
- 调用WCF时,调用已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定。
解决方案: 其实只要在客户端配置文件中加上如下紫色粗体属性( maxReceivedMessageSize): <?xml version="1.0" encoding=&q ...
- 用Quartus II 建立一个工程模板,以后新建工程时无需再配置参数
以前用Quartus II 每次新建工程时,都要设置工程名,选择工程路径,选择芯片型号等等,好麻烦呀!可不可以建一个工程模板,以后新建工程时直接改相应文件名就可以呀!后来我一琢磨,感觉也不是不可以.因 ...
- 使用Task简化Silverlight调用Wcf
原文http://www.cnblogs.com/lemontea/archive/2012/12/09/2810549.html 从.Net4.0开始,.Net提供了一个Task类来封装一个异步操作 ...
- 实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法
关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace Wcf ...
- WPF异步调用WCF服务
wpf调用wcf时,第一次访问总耗时到达几秒,影响界面的用户体验,因此在wpf加载界面和加载数据时采用异步加载,即异步访问wcf服务, 由于是否采用异步加载和服务端无关,仅仅由客户端自己根据需要来选择 ...
- JQuery调用WCF服务,部署在iis
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable ...
- Silverlight客户端调用WCF服务难题解疑
一:解决办法 Silverlight客户端调用WCF服务在实际使用中经常会出现的问题就是无法直接应用类文件和配置文件.微软针对这一情况已经给出了解决办法.WCF开发框架可以帮助我们实现可靠性较高的跨平 ...
- EF 6 调用存储过程时返回多结果集和OUTPUT参数问题
原文地址:http://q.cnblogs.com/q/56836/ 各位大侠,提问一个关于EF6调用存储过程时返回多结果集和OUTPUT参数问题 目前已经可以调用存储过程并且可以返回多个结果集. 但 ...
随机推荐
- BZOJ [Cqoi2017] 小Q的棋盘
题解:枚举最后在哪里停止,然后剩下的步数/2 也就是找最大深度 枚举终止位置算是一种思路吧 #include<iostream> #include<cstdio> #inclu ...
- MySQL 插入 中文数据乱码解决
问题描述: 1.在命令行中进行插入,没有问题.但是显示存在部分乱码 2.在JDBC中插入成功.中文是直接以“??”形式显示. 通过Navicat客户端查看 与在网页中看到的一一致,说明读取没有问题,问 ...
- (day 1)创建项目--3【创建应用】
创建步骤 1.打开命令行,进入项目中manage.py的同级目录 2.在命令行输入 python manage.py startapp blog 3.添加应用名到settings.py的INSTALL ...
- 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 A题
A - ^&^ Bit operation is a common computing method in computer science ,Now we have two positive ...
- css块级元素
<CSS权威指南>中文字显示:任何不是块级元素的可见元素都是内联元素.其表现的特性是“行布局”形式,这里的“行布局”的意思就是说其表现形式始终以行进行显示.比如,我们设定一个内联元素bor ...
- 详细的git入门级别,从安装到实战
拥有自己码云开源网站,想要上传项目到码云怎么操作?公司新技术提升由Svn转为Git,慌不慌?想要从Github开源网站下载开源项目,难道还依赖直接下载项目然后解压导入项目工程?下面可以通过及其简易且好 ...
- CENTOS YUM更新源
网络yum源和制作本地光盘yum源 配置CENTOS YUM更新源 yum安装rpm包安装后本地不清除的方法 sed -i 's#keepcache=0#keepcache=1#g' /etc/yum ...
- subprocess.Popen stdout重定向内容实时获取
python 打开一个新进程执行系统命令, test 执行完才能获取返回, test1 实时获取返回结果 import subprocess def test(cmd): p = subprocess ...
- flutter依赖某些插件,点击运行会出现错误
org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true android.enableAapt ...
- 宝塔面板,Typecho,Lsky Pro图床安装
宝塔面板,Typecho,Lsky Pro图床安装 本文安装包:链接:https://cloud.cangye.me/s/l3i4avjl 密码是宝塔面板4个汉字拼音首字母小写(防止被爬) 一,宝塔面 ...