从今天起开始跟着一个教程写一个关于WCF的系列博客,希望能够坚持下来。
作为第一篇,来一个简单点的,创建一个WCF服务。先看一张整体的图片。
通过上图可以看出,就是想通过一个WCF服务,来满足两个客户端的需求。一个是java web服务通过http访问,另一个则是windows web 服务通过Tcp访问。下面开始实战。
1.创建WCF服务
先创建一个类库,名称是HelloService,然后在此类库中创建WCF服务。
2.创建完后,我们会看到,WCF一个接口和一个实现类,并且有了一个DoWork的方法。我们做一下修改,把方法名称修改为DoWork,并在实现类中做一下实现。具体代码如下:
<span style="font-family:SimSun;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace HelloService
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“HelloService”。
public class HelloService : IHelloService
{
public string GetMessage(string name)
{
return "Hello" + name;
}
}
}
</span>
3.创建宿主
在第二步中就已经把WCF服务创建好了,由于服务是依赖于宿主的,所以我们得为服务找一个安身的场所。
新建控制台应用程序,名称为HelloServiceHost。在此需要添加WCF核心库using System.ServiceModel,并添加上述WCF类库的引用,添加配置文件,并在配置文件中做一下修改。
<span style="font-family:SimSun;font-size:18px;"><?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<services>
<!--服务实现类的名称-->
<service name="HelloService.HelloService" behaviorConfiguration="mexBehavior">
<!--binging代表绑定的类型,有很多例如basicHttpBinding、netTcpBinding-->
<!--contract代表我们所实现的契约,这就是我们对外提供的服务-->
<endpoint address="HelloService" binding="basicHttpBinding" contract="HelloService.IHelloService">
</endpoint>
<endpoint address="HelloService" binding="netTcpBinding" contract="HelloService.IHelloService">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<!--对外服务提供的基地址-->
<add baseAddress="http://localhost:8080/"/>
<add baseAddress="net.tcp://localhost:8090/"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="mexBehavior">
<!--代表我们的元数据能够通过http/get访问到-->
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration></span>
配置文件完成后,我们就开始启动我们的服务,在宿主中运行服务。具体代码如下:
<span style="font-family:SimSun;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
namespace HelloServiceHost
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(HelloService.HelloService)))
{
host.Open();
Console.WriteLine("host started" + DateTime.Now.ToString());
Console.ReadLine();
}
}
}
}
</span>
经过以上操作,就把我们写好的HelloService寄宿在我们的宿主中,并且启动成功,对外的地址是http://localhost:8080,可以访问地址,如果出现下述界面的话,代表成功。
4.创建window web应用程序
服务发布成功后,下面就创建一个web应用程序来访问我们的服务。
新建HelloWebClient网站应用程序,并添加服务应用。此时需要启动宿主中的服务。
这样就把我们刚才的服务引用添加其中。下面做一个简单的页面,就一个文本框,命令按钮和一个label,功能调用我们的服务,让label中现实文本框中的文本。具体代码如下:
<span style="font-family:SimSun;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace HelloWebClient
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
HelloService.HelloServiceClient client = new HelloService.HelloServiceClient("NetTcpBinding_IHelloService");
Label1.Text= client.GetMessage(TextBox1.Text);
}
}
}</span>
最终效果如下图
5.小结
通过上述一系列的操作,就完成了一个WCF服务的创建,下一节的内容是WCF服务实现多个契约。
本篇博客的源码地址:源码