契约操作不能使用引用对象作为参数,只允许使用基本类型或数据契约
2013-04-14 20:42
811 查看
今天看了一下wcf服务编程这本书,本来准备大致的浏览一下,但是当我看到了契约操作不能使用引用对象作为参数,只允许使用基本类型或数据契约这句话的时候,我知道契约操作只能是通过数据契约进行数据的传递,但是我也是好奇在电脑上测试了一下,结果发现这句话存在问题,可能是我对这句话的理解不够,或者说这句话隐含着什么别的意思,我没有理解透,下面我们就一起来通过这句话来构建一个测试程序来测试一下这句话的正确性。
我们首先定义了一个服务契约IBook,然后定义了一个实体类BookInfo,定义了一个方法GetBooks,其中参数为BookInfo类型,我们之所以这样定义是因为契约操作不能使用引用对象作为参数,只允许使用基本类型或数据契约 这句话中不能使用引用对象,而我们使用了一个类的对象,属于引用对象的范畴。
在服务类中我们实现了契约的方法,这其中没有什么要介绍的。
下一步就是托管代码的实现。
在托管程序启动以后我们就需要在客户端通过终结点访问服务,请注意我们传递的参数类型为BookInfo的实例,并不是数据契约
下面是客户端实例,其实这种过程都是老一套,只不过是更改了属性或者说是要测试特定的知识点。
这就说明刚才wcf服务编程上那句话是错误的,可能是我没有真正的理解那句话的真正含义,如果你知道这句话应该如何解释,麻烦你告诉我,谢谢。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.Runtime.Serialization; namespace Chinaer.WcfDemo.Contracts { public class BookInfo { public string Title { get; set; } public string Name { get; set; } } [ServiceContract( Namespace = "http://chinaer.com")] public interface IBook { [OperationContract] List<BookInfo> GetBooks(BookInfo info); [OperationContract] void Check(string strMessage); } }
我们首先定义了一个服务契约IBook,然后定义了一个实体类BookInfo,定义了一个方法GetBooks,其中参数为BookInfo类型,我们之所以这样定义是因为契约操作不能使用引用对象作为参数,只允许使用基本类型或数据契约 这句话中不能使用引用对象,而我们使用了一个类的对象,属于引用对象的范畴。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using Chinaer.WcfDemo.Contracts; namespace Chinaer.WcfDemo.Services { [ServiceBehavior()] public class BookService : IBook { public List<BookInfo> GetBooks(BookInfo bookInfo) { List<BookInfo> listBooks = new List<BookInfo>(); for (int i = 0; i < 100; i++) { BookInfo info = new BookInfo() { Title=i.ToString(), Name="name"+i.ToString() }; listBooks.Add(info); } return listBooks; } public void Check(string strMessage) { bool flag = false; if (strMessage.Equals("guozhiqi", StringComparison.OrdinalIgnoreCase)) { flag = true; } } } }
在服务类中我们实现了契约的方法,这其中没有什么要介绍的。
下一步就是托管代码的实现。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="Chinaer.WcfDemo.Services.BookService"> <endpoint bindingConfiguration="securityMode" address="http://192.168.1.106:88/bookService" binding="wsHttpBinding" contract="Chinaer.WcfDemo.Contracts.IBook"></endpoint> </service> </services> <bindings> <wsHttpBinding> <binding name="securityMode"> <security mode="None"></security> </binding> </wsHttpBinding> </bindings> <behaviors></behaviors> </system.serviceModel> </configuration>
using (ServiceHost guoHost = new ServiceHost(typeof(BookService))) { // Chinaer.WcfDemo.Contracts.IGuo if (guoHost.Description.Behaviors.Find<ServiceMetadataBehavior>() == null) { ServiceMetadataBehavior metaDataBehavior = new ServiceMetadataBehavior(); metaDataBehavior.HttpGetEnabled = true; metaDataBehavior.HttpGetUrl = new Uri("http://192.168.1.106:883/mex"); guoHost.Description.Behaviors.Add(metaDataBehavior); } guoHost.Opened += delegate { Console.WriteLine("bookService Open"); }; try { if (guoHost.State != CommunicationState.Opened || guoHost.State != CommunicationState.Opening) { guoHost.Open(); int i = 0; foreach (ChannelDispatcher channelDispatcher in guoHost.ChannelDispatchers) { Console.WriteLine("{0}:{1}", ++i, channelDispatcher.Listener.Uri); } Console.Read(); } } catch (CommunicationException ex) { guoHost.Abort(); } catch (Exception ex) { guoHost.Abort(); }
在托管程序启动以后我们就需要在客户端通过终结点访问服务,请注意我们传递的参数类型为BookInfo的实例,并不是数据契约
下面是客户端实例,其实这种过程都是老一套,只不过是更改了属性或者说是要测试特定的知识点。
//ServiceReference3.BookClient client = new ServiceReference3.BookClient(); //BookInfo info = new BookInfo(); //BookInfo[] arrinfo = client.GetBooks(info); using (ChannelFactory<IBook> chann = new ChannelFactory<IBook>("WSHttpBinding_IBook")) { IBook book = chann.CreateChannel(); using (book as IDisposable) { BookInfo[] arrInfo = book.GetBooks(new BookInfo()); Console.Read(); } }
这就说明刚才wcf服务编程上那句话是错误的,可能是我没有真正的理解那句话的真正含义,如果你知道这句话应该如何解释,麻烦你告诉我,谢谢。
相关文章推荐
- Java传递基本类型:值传递,对象作为参数:引用传递
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- 作为引用数据类型,数组变量与基本数据类型变量的使用有哪些区别?
- list集合对于基本数据类型与引用数据类型(对象)去重操作
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- 学习android JNI的那些事儿--------6. 在java中传入引用数据类型(对象)作为参数
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- Java集合不能存放基本数据类型,只存放对象的引用
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- Java集合不能存放基本数据类型,只存放对象的引用
- 黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用
- C/C++编写dll动态链接库使用操作与非基本类型参数声明错误(2)
- Java的IO操作(二) - 带缓冲区的流对象、写入基本数据类型、实现命令行中的copy命令
- Spring JDBC-使用Spring JDBC获取本地连接对象以及操作BLOB/CLOB类型数据
- 基本数据类型和引用数据类型参数的传递