解决一个通过 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参数问题 目前已经可以调用存储过程并且可以返回多个结果集. 但 ...
随机推荐
- 18 12 26 css 学习 选择器
1.标签选择器 标签选择器,此种选择器影响范围大,建议尽量应用在层级选择器中.举例: *{margin:0;padding:0} div{color:red} <div>....</ ...
- MySQL视图和事务
视图的操作 ...
- mysql 启动报错Host name could not be resolved解决办法
mysql 启动报错信息如下: [root@xxx ~]# 2018-01-26 17:06:35 33 [Warning] Host name 'bogon' could not be resolv ...
- mysql快速搭建从库
基于mysqldump快速搭建从库 https://blog.csdn.net/leshami/article/details/44994329 使用xtrbackup克隆从库 https://blo ...
- 运营商何时会取消40G或100G流量封顶呢?短期内有望实现吗?
一直以来,运营商的不限流量套餐就饱受人们的诟病.因为说是不限流量,但其实运营商故意设置了"封顶"!最常见的封顶限制,就是流量超过40G网速会降速到1Mbps--实际下载速度为128 ...
- share团队冲刺8
团队冲刺第八天 昨天:完善代码,解决其中的问题 今天:将除登陆界面之外的界面进行修改和完善,使其美观 问题:bindview不会用,使用时出现问题
- dp--01背包--Charm Bracelet
Charm Bracelet Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, sh ...
- 寒假day04
今天编写了毕设系统中的专家画像模块,实现了人员标签的建立与划分,同时刷了牛客网的面试相关题目. 1.如果系统的umask设置为244,创建一个新文件后,它的权限:(C) --w-r--r-- -r-x ...
- Win 10 Ctrl + Space 冲突
1. 说明 在IDE里面Ctrl + space 会与 Windows 输入法相互冲突,并且用Ctrl + Space 切换中英文也很不常用(常用直接shift切换). 2. 操作 控制面板——时钟. ...
- ZJNU 1217 - 航线问题——高级
将所有航线的其中一边排序后,另一边进行类dp 定义一个数组c,c[i]表示在所有能够开通i条航线的组合中,位置序号最大的那条航线的序号的最小值 比如下面一个样例 1 3 2 4 3 1 4 2 此时对 ...