18.3 WCF应用
在了解了基本的WCF概念后,先不用着急继续了解WCF应用体系,通过创建WCF应用可以深入的了解服务、地址和契约的概念。WCF还允许开发人员创建和声明契约,通过契约的声明,客户端可以通过远程调用以实现自身的程序。
18.3.1 创建WCF应用
在Visual Studio 2008中,可以方便的创建WCF应用。在菜单栏中选择【文件】选项,在下拉菜单中单击【新建项目】选项,在弹出的【新建项目】窗口中选择WCF,如图18-7所示。
图18-7 创建WCF服务库
创建WCF服务库后,应用程序会自动生成Server1.cs和IServer1.cs接口,IServer1.cs接口示例代码如下所示。
上述代码创建了一个IServer1接口,并通过ServiceContractAttribute标识服务契约,同样也通过DataContractAttribute、DataMemberAttribute来标识自定义数据类型和属性,示例代码如下所示。
创建接口后则需要实现接口,接口的实现在Server.cs文件内,示例代码如下所示。
上述代码实现了IServer1接口中的方法,单击【运行】按钮或快捷键【F5】,WCF应用程序就能够运行,如图18-8所示。
图18-8 服务测试客户端
从图18-8中可以看出,在Server1.cs文件中实现的方法都能够在测试客户端中看到,单击测试客户端中相应的方法就能够在客户端测试调用服务器端的方法,如图18-9所示。
图18-9 测试方法调用
双击GetData方法后,在右侧选项卡中就会分为两层,这两层分别为请求和响应。在请求框中可以在值那一栏编写需要传递的值,编写完毕后单击【调用】按钮就能够实现服务器端方法的调用并在响应框中呈现相应的值。
18.3.2 创建WCF方法
一个简单的WCF应用程序运行后,就会发现其实WCF并没有想象中的复杂。WCF允许开发人员通过使用ServiceContractAttribute标识服务契约,同样开发人员还能够创建服务契约以提供客户端的方法的调用。在IServer1接口中首先需要定义该方法,示例代码如下所示。
上述代码声明了两个方法,这两个方法分别为GetSum和GetShopInformation,,GetSum用于获取某一天麦当劳餐厅中出售总量,而GetShopInformation用于获取麦当劳地址和一些商店的信息,GetSum和GetShopInformation具体实现如下所示。
在GetSum方法中,用于获取当天的销售总量,而GetShopInformation实现了商店信息的反馈,运行后如图18-10所示。
图18-10 创建方法
从图18-10中可以看出,GetShopInformation已经在测试客户端中服务器项目中显式了,并且输入了“武汉”这个信息,就能够返回“武汉麦当劳连锁店”。而GetSum方法并没有呈现在服务器项目中,这是因为GetSum方法并没有使用[OperationContract]标识进行声明,所以不会作为契约的一部分,若需要在客户端调用GetSum方法就必须使用[OperationContract]标识进行声明,示例代码如下所示。
WCF应用程序运行后如图18-11所示。
图18-11 使用[OperationContract]标识
开发人员能够使用WCF快速的创建WCF应用程序并从客户端调用该方法,这样就能够在客户端隐藏服务器方法并且让客户端只关注逻辑实现而不需要关注底层是如何进行消息通信的。
18.3.1 创建WCF应用
在Visual Studio 2008中,可以方便的创建WCF应用。在菜单栏中选择【文件】选项,在下拉菜单中单击【新建项目】选项,在弹出的【新建项目】窗口中选择WCF,如图18-7所示。
图18-7 创建WCF服务库
创建WCF服务库后,应用程序会自动生成Server1.cs和IServer1.cs接口,IServer1.cs接口示例代码如下所示。
+展开
-C#
using System;
using System.Collections.Generic;
using System.Linq; //使用必要的命名空间
using System.Runtime.Serialization;//使用必要的命名空间
using System.ServiceModel;//使用必要的命名空间
using System.Text;
namespace _18_2
{
// 注意: 如果更改此处的接口名称“IService1”,也必须更新 App.config 中对“IService1”的引用。
[ServiceContract]
public interface IService1
{
[OperationContract]//声明契约
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);// 任务: 在此处添加服务操作
}
// 使用下面示例中说明的数据协定将复合类型添加到服务操作
[DataContract]
public class CompositeType//创建类
{
bool boolValue = true;//创建字段
[DataMember]
string stringValue = "Hello ";//声明string变量
[DataMember]
public bool BoolValue//创建属性
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember]
public string StringValue//创建属性
{
get { return stringValue; }
set { stringValue = value; }
}
}
}
using System.Collections.Generic;
using System.Linq; //使用必要的命名空间
using System.Runtime.Serialization;//使用必要的命名空间
using System.ServiceModel;//使用必要的命名空间
using System.Text;
namespace _18_2
{
// 注意: 如果更改此处的接口名称“IService1”,也必须更新 App.config 中对“IService1”的引用。
[ServiceContract]
public interface IService1
{
[OperationContract]//声明契约
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);// 任务: 在此处添加服务操作
}
// 使用下面示例中说明的数据协定将复合类型添加到服务操作
[DataContract]
public class CompositeType//创建类
{
bool boolValue = true;//创建字段
[DataMember]
string stringValue = "Hello ";//声明string变量
[DataMember]
public bool BoolValue//创建属性
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember]
public string StringValue//创建属性
{
get { return stringValue; }
set { stringValue = value; }
}
}
}
上述代码创建了一个IServer1接口,并通过ServiceContractAttribute标识服务契约,同样也通过DataContractAttribute、DataMemberAttribute来标识自定义数据类型和属性,示例代码如下所示。
+展开
-C#
[ServiceContract]//标识服务契约
public interface IService1//创建接口
[DataContract]
public class CompositeType
public interface IService1//创建接口
[DataContract]
public class CompositeType
创建接口后则需要实现接口,接口的实现在Server.cs文件内,示例代码如下所示。
+展开
-C#
public class Service1 : IService1//实现接口
{
public string GetData(int value)//实现接口方法
{
return string.Format("You entered: {0}", value);//返回string值
}
public CompositeType GetDataUsingDataContract(CompositeType composite)//实现接口方法
{
if (composite.BoolValue)//实现方法代码
{
composite.StringValue += "Suffix";//添加相应数据
}
return composite;//返回值
}
{
public string GetData(int value)//实现接口方法
{
return string.Format("You entered: {0}", value);//返回string值
}
public CompositeType GetDataUsingDataContract(CompositeType composite)//实现接口方法
{
if (composite.BoolValue)//实现方法代码
{
composite.StringValue += "Suffix";//添加相应数据
}
return composite;//返回值
}
上述代码实现了IServer1接口中的方法,单击【运行】按钮或快捷键【F5】,WCF应用程序就能够运行,如图18-8所示。
图18-8 服务测试客户端
从图18-8中可以看出,在Server1.cs文件中实现的方法都能够在测试客户端中看到,单击测试客户端中相应的方法就能够在客户端测试调用服务器端的方法,如图18-9所示。
图18-9 测试方法调用
双击GetData方法后,在右侧选项卡中就会分为两层,这两层分别为请求和响应。在请求框中可以在值那一栏编写需要传递的值,编写完毕后单击【调用】按钮就能够实现服务器端方法的调用并在响应框中呈现相应的值。
18.3.2 创建WCF方法
一个简单的WCF应用程序运行后,就会发现其实WCF并没有想象中的复杂。WCF允许开发人员通过使用ServiceContractAttribute标识服务契约,同样开发人员还能够创建服务契约以提供客户端的方法的调用。在IServer1接口中首先需要定义该方法,示例代码如下所示。
+展开
-C#
int GetSum(DateTime time);//定义接口方法
[OperationContract]//标识调用
string GetShopInformation(string address);
[OperationContract]//标识调用
string GetShopInformation(string address);
上述代码声明了两个方法,这两个方法分别为GetSum和GetShopInformation,,GetSum用于获取某一天麦当劳餐厅中出售总量,而GetShopInformation用于获取麦当劳地址和一些商店的信息,GetSum和GetShopInformation具体实现如下所示。
+展开
-C#
public int GetSum(DateTime time)//实现方法
{
int BreadNum = 10;//声明必要字段
int Milk = 5; //声明必要字段
int HotDryNuddle = 20; //声明必要字段
int today = BreadNum + Milk + HotDryNuddle;//实现计算
return today; //返回值
}
public string GetShopInformation(string address)//实现方法
{
if (address == "武汉")//判断地址
{
return "武汉麦当劳连锁店";//返回相应结果
}
else if (address == "北京")//判断地址
{
return "北京麦当劳连锁店";//返回相应结果
}
else if (address == "上海") //判断地址
{
return "上海麦当劳连锁店";//返回相应结果
}
else
{
return "没有该连锁店";//返回默认结果
}
}
{
int BreadNum = 10;//声明必要字段
int Milk = 5; //声明必要字段
int HotDryNuddle = 20; //声明必要字段
int today = BreadNum + Milk + HotDryNuddle;//实现计算
return today; //返回值
}
public string GetShopInformation(string address)//实现方法
{
if (address == "武汉")//判断地址
{
return "武汉麦当劳连锁店";//返回相应结果
}
else if (address == "北京")//判断地址
{
return "北京麦当劳连锁店";//返回相应结果
}
else if (address == "上海") //判断地址
{
return "上海麦当劳连锁店";//返回相应结果
}
else
{
return "没有该连锁店";//返回默认结果
}
}
在GetSum方法中,用于获取当天的销售总量,而GetShopInformation实现了商店信息的反馈,运行后如图18-10所示。
图18-10 创建方法
从图18-10中可以看出,GetShopInformation已经在测试客户端中服务器项目中显式了,并且输入了“武汉”这个信息,就能够返回“武汉麦当劳连锁店”。而GetSum方法并没有呈现在服务器项目中,这是因为GetSum方法并没有使用[OperationContract]标识进行声明,所以不会作为契约的一部分,若需要在客户端调用GetSum方法就必须使用[OperationContract]标识进行声明,示例代码如下所示。
+展开
-C#
[OperationContract]
int GetSum(DateTime time);//标识客户端方法
int GetSum(DateTime time);//标识客户端方法
WCF应用程序运行后如图18-11所示。
图18-11 使用[OperationContract]标识
开发人员能够使用WCF快速的创建WCF应用程序并从客户端调用该方法,这样就能够在客户端隐藏服务器方法并且让客户端只关注逻辑实现而不需要关注底层是如何进行消息通信的。
加支付宝好友偷能量挖...