WCF 漫谈

wcf传输地址分为HTTP,TCP,Peer network(对等网)和MSMQ

地址通常采用的格式为:

[基地址]/[可选的URL]

基地址通常的格式为;

[传输协议]://[机器名或者域名][:可选端口]

可以讲地址http://localhost:8001读作:"采用HTTP协议访问loaclhost机器,并在8001端口等待调用"

如果URL为http://localhost:8001/MyService,则读作“采用HTTP协议访问localhost机器。MyService服务在端口8001等待调用”

简单例子如下:

添加wcf文件DService1

添加using System.ServiceModel;

两个控制台文件

Host3启动服务,客户端WebWCF1

===============================================================

定义契约

namespace DService1
{
// 注意: 如果更改此处的接口名称“IService1”,也必须更新 App.config 中对“IService1”的引用。
[ServiceContract]
public interface IService1
{
// 放回时间
[OperationContract]
DateTime happy();


}
}

定义服务返回时间

namespace DService1
{
// 注意: 如果更改此处的类名“IService1”,也必须更新 App.config 中对“IService1”的引用。
public class Service1 : IService1
{
#region IService1 成员

public DateTime happy()
{
return DateTime.Now;
}

#endregion
}
}

服务端:

// 代码绑定
using (ServiceHost host = new ServiceHost( typeof (DService1.Service1)))
{
// 绑定
host.AddServiceEndpoint( typeof (DService1.IService1), new WSHttpBinding(), " http://localhost:7000 " );
// 设置数据交换方式
if (host.Description.Behaviors.Find < ServiceMetadataBehavior > () == null )
{
ServiceMetadataBehavior behavior
= new ServiceMetadataBehavior();
behavior.HttpGetEnabled
= true ;
host.Description.Behaviors.Add(behavior);
}
host.Opened
+= delegate
{
Console.WriteLine(
" CalculaorService已经启动,按任意键终止服务! " );
};
host.Open();
Console.Read();

}

如果要契约appconfig配置的话

则服务端首先配置配置文件

< configuration >
< system.serviceModel >
< services >
<!-- name服务名;behaviorConfiguration数据绑定配置必须和下面的behavior name一致 -->
< service name = " DService1.Service1 " behaviorConfiguration = " serviceBehavior " >
<!-- endpoint终结点;binding绑定协议;contract契约名 -->
<!-- 定义终节点 -->
<!-- binding 绑定类型,NetTcpBinding、WSDualHttpBinding、WSHttpBindingBase、BasicHttpBinding、NetNamedPipeBinding、NetPeerTcpBinding、MsmqBindingBase、NetPeerTcpBinding、WebHttpBinding、MailBindingBase、CustomBinding -->
<!-- DuplexBinding 双工 -->
<!-- 使用契约: < 命名空间 > . < 接口名称 >-->
<!-- address = " DService1 " 或者address == “http: // localhost:7000”-->
< endpoint binding = " basicHttpBinding " contract = " DService1.IService1 " address = " DService1 " />
< endpoint binding = " mexHttpBinding " contract = " IMetadataExchange " address = " mex " />
< host >
< baseAddresses >
< add baseAddress = " http://localhost:7000 " />
< add baseAddress = " net.tcp://localhost:8000 " />
</ baseAddresses >
</ host >
</ service >
</ services >
<!-- 绑定配置 -->
< behaviors >
< serviceBehaviors >
< behavior name = " serviceBehavior " >
< serviceMetadata httpGetEnabled = " true " />
</ behavior >
</ serviceBehaviors >
</ behaviors >
</ system.serviceModel >
</ configuration >

再将服务端代码改为:

ServiceHost host = new ServiceHost( typeof (DService1.Service1));
// host.AddServiceEndpoint(typeof(DService1.IService1), new NetTcpBinding(), "net.tcp: // localhost:8008/Service1");
host.Open();

Console.WriteLine(
" Service open " );
Console.ReadLine();

这样服务端都配置完成

客户端:

情况一:当不添加服务引用是可以使用代理来执行,此时上面服务端注释的

 host.AddServiceEndpoint(typeof(DService1.IService1), new NetTcpBinding(), "net.tcp://localhost:8008/Service1");

启用

再前段代码

// 使用代理方法,注:此接口与服务端的接口必须一致
[ServiceContract]
public interface IService1
{
[OperationContract]
DateTime happy();
}

protected void Button1_Click( object sender, EventArgs e)
{
// 代理
IService1 Proxy = ChannelFactory < IService1 > .CreateChannel( new NetTcpBinding(), new EndpointAddress( " net.tcp://localhost:8008/Service1 " ));

DateTime client
= Proxy.happy();
string s = Convert.ToString(client);
Response.Write(s);
}

情况二:

将服务引用过来

localhost.Service1Client Proxy = new WebWCF1.localhost.Service1Client();
DateTime client
= Proxy.happy();
string s = Convert.ToString(client);
Console.WriteLine(s);
Console.WriteLine(
" 按ENTER键退出 " );
Console.ReadLine();

你可能感兴趣的:(WCF)