1 新建空解决方案WCFExample
在解决方案WCFExample下新建以下项目:
- Service(输出类型为“类库”):WCF服务程序。
- Business(输出类型为“类库”):供WCF服务调用的具体业务实现。
- Host(输出类型为“控制台应用程序”):WCF服务宿主程序。
- Client(输出类型为“Windows应用程序 ”):调用WCF服务的客户端程序。
项目结构如下图所示。
2 实现Business项目
项目下新建BubbleSortBusiness类(类文件BubbleSortBusiness.cs),类中添加BubbleSort方法实现冒泡排序功能,客户端程序通过WCF服务调用该方法来完成冒泡排序操作。
详细代码如下所示。
using System;
namespace Business
{
public class BubbleSortBusiness
{
public int[] BubbleSort(int[] listNumber)
{
try
{
if (listNumber != null && listNumber.Length != 0)
{
bool flag;
int temp;
for (int i = 0; i < listNumber.Length - 1; i++)
{
flag = false;
for (int j = 0; j < listNumber.Length - i - 1; j++)
{
if (listNumber[j] > listNumber[j + 1])
{
temp = listNumber[j];
listNumber[j] = listNumber[j + 1];
listNumber[j + 1] = temp;
flag = true;
}
}
if (!flag)
{
break;
}
}
return listNumber;
}
else
{
return null;
}
}
catch(Exception ex)
{
//将异常写入log(代码省略)
return null;
}
}
}
}
3 实现Service项目
首先,需要添加对Business项目的引用,因为Service项目需要调用Business下的BubbleSort方法来完成冒泡排序操作。
我们这里直接添加项目Business编译后的dll即可,另外还需要添加对System.ServiceModel的引用。
添加引用后引用文件夹包含下图所示内容。
接着,在项目下新建IBubbleSortService接口(类文件IBubbleSortService.cs),详细代码如下所示。
using System.ServiceModel;
namespace Service
{
[ServiceContract]
public interface IBubbleSortService
{
[OperationContract]
int[] BubbleSort(int[] listNumber);
}
}
紧接着,添加IBubbleSortService接口的实现类BubbleSortService (类文件BubbleSortService.cs),详细代码如下所示。
using Business;
namespace Service
{
public class BubbleSortService : IBubbleSortService
{
public int[] BubbleSort(int[] listNumber)
{
return new BubbleSortBusiness().BubbleSort(listNumber);
}
}
}
4 实现Host项目
WCF不能独立运行,需要一个载体来承载才能运行,此载体被称作宿主。
宿主程序可以是Windows应用程序,控制台应用程序,ASP.NET应用程序等。
本文新建一个控制台应用程序Host作为WCF服务的宿主程序。
一开始,需要添加对Service项目的引用,添加方法同样是添加Service项目编译后的dll即可。另外,同样需要添加对System.ServiceModel的引用。
添加引用后引用文件夹包含下图所示内容。
接着,修改项目下类文件Program,cs的代码如下所示。
using System;
using System.ServiceModel;
using Service;
namespace Host
{
class Program
{
static void Main(string[] args)
{
Type ServiceType = typeof(BubbleSortService);
using (ServiceHost host = new ServiceHost(ServiceType))
{
host.Open();
Console.WriteLine("服务已经启动!");
Console.ReadKey(true);
host.Close();
}
}
}
}
随后,添加配置文件App.config,配置文件的详细内容如下所示。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Service.BubbleSortService" behaviorConfiguration="BubbleSortService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8888/Service/"/>
</baseAddresses>
</host>
<endpoint address="BubbleSortService" binding="basicHttpBinding" contract="Service.IBubbleSortService">
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="BubbleSortService">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
编译项目Host后,运行Host.exe,效果如下图所示。
在浏览器地址栏输入服务访问地址http://localhost:8888/Service/,测试服务是否能够访问。如果显示下图结果则说明服务可以被访问。
5 实现Client项目
首先,需要添加对服务的引用。
添加方法:在“引用”文件夹上右键点击菜单项“添加服务引用”打开“添加服务引用”窗口。
在“添加服务引用”窗口的地址栏输入服务地址后,点击“前往”按钮,选中需要添加的服务,点击“确定”按钮即可完成服务引用的添加。
(注意:添加服务引用时,Host.exe程序需要运行起来,这样才可以找到需要被添加的服务。)
添加服务引用成功后,在Client项目下会出现Service References目录,同时生成了配置文件app.config(如下图所示)。
配置文件app.config的详细内容如下所示。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IBubbleSortService" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:8888/Service/BubbleSortService"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IBubbleSortService"
contract="ServiceReference1.IBubbleSortService" name="BasicHttpBinding_IBubbleSortService" />
</client>
</system.serviceModel>
</configuration>
注意:这个app.config文件是自动生成的,不需要手动添加,但是也不能被删除。
随后,制作窗体程序的界面,如下图所示。
同时,编写窗体的后端代码,如下所示。
using System;
using System.Windows.Forms;
namespace Client
{
public partial class frmSorter : Form
{
ServiceReference1.BubbleSortServiceClient bubbleSortClient
= new ServiceReference1.BubbleSortServiceClient();
public frmSorter()
{
InitializeComponent();
}
private void btnSort_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(txtSrcData.Text.Trim()))
{
//省略数据校验代码
//必须是由逗号分隔的整型数据
string srcData = txtSrcData.Text.Trim();
string[] arrSrcData = srcData.Split(',');
int len = arrSrcData.Length;
int[] intSrcData = new int[len];
for (int i = 0; i < len; i++)
{
intSrcData[i] = Convert.ToInt32(arrSrcData[i]);
}
intSrcData = bubbleSortClient.BubbleSort(intSrcData);
string strResult=string.Empty;
for (int i = 0; i < len; i++)
{
strResult += Convert.ToString(intSrcData[i])+" ";
}
txtSortedData.Text = strResult;
}
else
{
MessageBox.Show("请输入待排序的整型数据!");
}
}
}
}
6 运行程序
运行Client.exe与Host.exe程序,得到以下结果。
至此,一个简单的WCF程序完成了。