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程序完成了。