C# WCF之用接口创建服务契约、部署及客户端连接

服务契约描述了暴露给外部的类型(接口或类)、服务所支持的操作、使用的消息交换模式和消息的格式。每个WCF服务必须实现至少一个服务契约。使用服务契约必须要引用命名空间System.ServiceModel 。

ServiceContractAttribute

OperationContractAttribute

1,先创建一个类库为ClassLibrary1,在创建一个接口interface1。

2,添加引用和命名空间,System.ServiceModel

3,在接口里代码如下:

namespace ClassLibrary1

{ //服务契约

[ServiceContract]

public interface Interface1

{ //操作契约

[OperationContract]

string Hello();

}

}

4,创建一个窗体或控制台程序并创建一个类HelloClass.cs

5,添加引用(项目里面)ClassLibrary1

6,HelloClass1.cs里代码如下

class HelloClass:ClassLibrary1.Interface1

{

public string Hello()

{

return "Hello wcf!";

}

}

基本创建一个服务。创建之后需要部署。一般分为配置文件部署和代码部署。

一,配置文件部署

服务的三要素

A:Address 意味着在哪里(也含有传输方式信息)

B:Binding 意味着怎么做(与地址的传输方式要匹配)

C:Contract意味着做什么(服务契约)

<system.ServiceModel>

<services>

<service>

<endpoint/> /*服务和终结点*/

</service>

</services>

<bindings> /*绑定(可选)*/

<binding>

</binding>

</bindings>

<behaviors> /*行为(可选) */

<behavior>

</behavior>

</behaviors>

</system.ServiceModel>

终结点的地址由EndpointAddress 类表示,该类包含一个表示服务地址的统一资源定位符(URI),大多数传输的地址URI 包含四个部分。

例如,

“http://www.sina.com.cn:3200/mathservice”这个URI 具有以下四个部分:

– 方案:http:

– 计算机:www.sina.com.cn

– (可选)端口:3200

– 路径:/mathservice

在上面例题上继续完善,打开app.config文件

<system.serviceModel>

<services>

<service name="ConsoleApplication1.HelloClass" behaviorConfiguration="testBehavior"> <!--name为实现该契约的类-->

<host>

<baseAddresses>

<add baseAddress="http://localhost:8002/test"></add><!--基地址-->

</baseAddresses>

</host>

<endpoint address="" binding="basicHttpBinding" contract="ClassLibrary1.Interface1"></endpoint>

<!--已有baseAddress基地址,address可为空;binding为绑定类型,对应Http协议;contract为所公开的协议,即所创建的服务契约接口-->

</service>

</services>

<behaviors>

<serviceBehaviors>

<behavior name="testBehavior"> <!--与上面behaviorConfiguration="testBehavior"保持一致,可为空-->

<serviceMetadata httpGetEnabled="true"/> <!--指定是否要发布元数据以HTTP/Get获取-->

</behavior>

</serviceBehaviors>

</behaviors>

</system.serviceModel>

之后需要启动服务

在ConsoleApplication1的program.cs里添加应用和命名空间System.ServiceModel和以下代码

ServiceHost host = null;

host = new ServiceHost(typeof(ConsoleApplication1.HelloClass));

host.Open();

Console.WriteLine("服务已经启动!");

Console.ReadLine();

运行代码后,将http://localhost:8002/test在浏览器打开将会看到相关服务信息。

二,代码部署

先创建一个控制台程序 ConsoleApplication2,添加一个类HelloClass.cs和引用及命名空间,服务接口

在program.cs 添加命名空间

ServiceHost host = null;

host = new ServiceHost(typeof(ConsoleApplication2.HelloClass));

NetTcpBinding tcpBind = new NetTcpBinding();//设定绑定类型

string address = "net.tcp://localhost:3200/hello";

host.AddServiceEndpoint(typeof(ClassLibrary1.Interface1), tcpBind, address);//在服务终结点添加,协议,绑定类型,终结点地址

host.Opened += delegate { Console.WriteLine("服务已启动!"); Console.ReadLine(); };

host.Open();

当服务部署成功后,客户端可以连接服务并调用方法,一般有两种方式

一,如上一节讲的直接添加服务引用来实现

二,纯代码实现

先创建一个客户端,client控制台程序以及相关引用、命名空间、服务接口引用

//绑定形式

NetTcpBinding bind = new NetTcpBinding();

//提供客服端与服务建立连接的地址

EndpointAddress address = new EndpointAddress("net.tcp://localhost:3200/hello");

//客户端通关通道工厂将消息发送到不同配置的服务终结点

ChannelFactory<ClassLibrary1.Interface1> factory = new ChannelFactory<ClassLibrary1.Interface1>(bind, address);

//通过通道工厂对象来获取指定类型

ClassLibrary1.Interface1 myobject = factory.CreateChannel();

string s = myobject.Hello();

Console.WriteLine(s);

Console.ReadLine();

先启动服务,在运行客户端。