WCF客户端和服务的实现

简介:
WCF客户端和服务

?服务器端:

– 定义和实现服务契约

– 为服务类型构建ServiceHost实例,暴露endpoints

– 打开通讯通道

?客户端:

– 需要服务契约的一个副本和关于endpoints的信息

– 为特定的endpoint构建通信通道并且调用操作

clip_image002

客户端的客户进程中,有一个代理,该代理主要功能是完成客户进程和主机进程之间的通信。Proxy并不直接和主机的Endpoint通信,而是由客户端自己提供一个Endpoint和主机的Endpoint通信。

服务端有一个主机Host,提供服务,服务由Endpoint向外发布接口。

消息的通信由两端的Endpoint通信。

代码示例:

服务端代码

using System;

using System.ServiceModel;

namespace HelloIndigo

{

[ServiceContract(Namespace="http://www.monkeyfu.net")]

public interface IHelloIndigoService

{

[OperationContract]

string HelloIndigo(string message);

}

public class HelloIndigoService : IHelloIndigoService

{

#region IHelloIndigoService Members

public string HelloIndigo(string message)

{

return string.Format("Receivied message at{0}:{1}", DateTime.Now, message);

}

#endregion

}

}

此处主要定义了服务契约。在WCF中,定义一个契约使用的是ServiceContract。只有定义了OperationContract的方法才会被放入服务中。

宿主程序

通常情况,服务宿主程序需要使用ServiceHost类,当使用IIS或者WAS作为宿主程序的时候IIS和WAS会自动创建ServiceHost类型。当自定义宿主服务的时候,需要手动创建ServiceHost对象。

namespace Host

{

class Program

{

static void Main(string[] args)

{

using (ServiceHost host = new ServiceHost(typeof(HelloIndigo.HelloIndigoService)))//手动创建ServiceHost

{

host.AddServiceEndpoint(typeof(HelloIndigo.IHelloIndigoService), new NetTcpBinding(), "net.tcp://localhost:9009/HelloIndigo");

host.Open();

Console.ReadLine();

}

}

}

}

客户端

客户端的契约要和服务端的保持一致

namespace Client

{

//和服务端的契约定义要一致。

[ServiceContract(Namespace = "http://www.monkeyfu.net")]

public interface IHelloIndigoService

{

[OperationContract]

string HelloIndigo(string message);

}

class Program

{

static void Main(string[] args)

{

IHelloIndigoService proxy = ChannelFactory<IHelloIndigoService>.CreateChannel(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:9009/HelloIndigo"));

string s = proxy.HelloIndigo("Hello from client...");

Console.WriteLine(s);

Console.ReadLine();

}

}

}

Endpoint

Endpoint实际上由ABC三个要素组成Address,Binding,Contract

clip_image004

使用配置文件实现服务和Endpoint

前面的方法是通过手工编程实现的,事实上,可以不用写代码而通过配置文件实现服务调用。

只使用代码而不用配置文件的情况不适合IIS为宿主的情况,IIS宿主必须使用配置文件配置WCF的ServiceHost。

主要步骤如下:

配置Host的配置文件如下:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<system.serviceModel>

<services>

<service name="HelloIndigo.HelloIndigoService" behaviorConfiguration="serviceBehavior">

<endpoint binding="basicHttpBinding" contract="HelloIndigo.IHelloIndigoService" address="HelloIndigo" />

<endpoint binding="mexHttpBinding" contract="IMetadataExchange" address="mex" />

<host>

<baseAddresses>

<add baseAddress="http://localhost:8008"/>

</baseAddresses>

</host>

</service>

</services>

<behaviors>

<serviceBehaviors>

<behavior name="serviceBehavior">

<serviceMetadata httpGetEnabled="true" />

</behavior>

</serviceBehaviors>

</behaviors>

</system.serviceModel>

</configuration>

配置完毕后,宿主代码可以如下写法, 不再需要添加endpoint

static void Main(string[] args)

{

using (ServiceHost host = new ServiceHost(typeof(HelloIndigo.HelloIndigoService)))//手动创建ServiceHost

{

//host.AddServiceEndpoint(typeof(HelloIndigo.IHelloIndigoService), new NetTcpBinding(), "net.tcp://localhost:9009/HelloIndigo");

host.Open();

Console.ReadLine();

}

}

为客户端添加Service Reference。对于客户端代码,可以不必要再写契约定义,因为添加完Service Reference之后,系统自动生成很多相关代码。按如下方法写即可。

添加完毕后可以适当修改app.config

namespace Client

{

////和服务端的契约定义要一致。

//[ServiceContract(Namespace = "http://www.monkeyfu.net")]

//public interface IHelloIndigoService

//{

// [OperationContract]

// string HelloIndigo(string message);

//}

class Program

{

static void Main(string[] args)

{

//IHelloIndigoService proxy = ChannelFactory<IHelloIndigoService>.CreateChannel(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:9009/HelloIndigo"));

Client.ServiceReference1.HelloIndigoServiceClient proxy = new Client.ServiceReference1.HelloIndigoServiceClient();

string s = proxy.HelloIndigo("Hello from client...");

Console.WriteLine(s);

Console.ReadLine();

}

}

}





















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/572975,如需转载请自行联系原作者

相关文章
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
73 0
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
107 0
|
C++
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
138 0
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
WCF使用纯代码的方式进行服务寄宿
服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用,除去上面的两种寄宿方式,还可以以纯代码的方式实现服务的寄宿工作。
891 0
|
Windows
WCF服务寄宿到IIS
一.WCF简介: Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。
1096 0
WCF服务自我寄宿
WCF服务的寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以寄宿在各种进程之中,常见的寄宿有: IIS服务、Windows服务、Winform程序、控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便、高效提供服务调用。
1035 0
|
网络架构
(纯代码)快速创建wcf rest 服务
因为有一个小工具需要和其它的业务对接数据,所以就试一下看能不能弄一个无需配置快速对接的方法出来,百(以)度(讹)过(传)后(讹),最后还是对照wcf配置对象调试出来了: 1.创建WebHttpBinding 2.
1012 0