继续学习wcf的实例化服务之单调服务,书里面介绍的比较复杂,其实可以直接通过案例去理解更简单。直接代码(源代码下载):
服务端:
[ServiceContract]
public interface IMyContract
{
[OperationContract]
void MyMethod();
}
服务实现:
其实和平时的服务实现区别并不是特别大,单调服务就是引用了这个服务行为: [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]。
count计次是为了看变化的:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
public class MyService : IMyContract,IDisposable
{
/// <summary>
/// 计次
/// </summary>
int count=0;
MyService()
{
Console.WriteLine( "创建服务实例:MyService()");
}
public void MyMethod()
{
count++;
Console.WriteLine("调用方法:MyMethod,count的值:"+count);
}
public void Dispose()
{
Console.WriteLine("服务实例销毁!");
}
}
寄宿和配置
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="calculatorServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="calculatorServiceBehavior" name="Service.MyService">
<endpoint binding="basicHttpBinding" contract="Service.IMyContract"/>
<host>
<baseAddresses>
<add baseAddress="http://localhost:1234/MyService"/>
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(MyService)))
{
host.Open();
Console.WriteLine("开启服务。。。");
Console.Read();
}
}
客户端配置和调用:
配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<!---->
<client>
<endpoint name="MyService"
address="http://localhost:1234/MyService"
binding="basicHttpBinding"
contract="Service.IMyContract"/>
</client>
</system.serviceModel>
</configuration>
main:
static void Main(string[] args)
{
using (ChannelFactory<IMyContract> channelFactory = new ChannelFactory<Service.IMyContract>("MyService"))
{
Console.WriteLine("创建实例:proxy");
IMyContract proxy = channelFactory.CreateChannel();
Console.WriteLine("调用方法MyMethod()");
proxy.MyMethod();
Console.WriteLine("调用方法Mymethod()");
proxy.MyMethod();
Console.WriteLine("创建实例:proxy2");
IMyContract proxy2 = channelFactory.CreateChannel();
Console.WriteLine("调用方法MyMethod()");
proxy2.MyMethod();
Console.WriteLine("调用方法MyMethod()");
proxy.MyMethod();
Console.WriteLine("关闭代理。。。");
channelFactory.Close();
Console.Read();
}
}
其实客户端的也很简单,就是多写了点输出做对比的。就创建了两个实例,然后调用两次方法,然后关闭代理。直接看结果来解释,单调服务到底是啥:
从结果上就能看到,所谓的单调服务,其实就是每次调用服务的方法,服务实例都会创建和销毁一次,所以这也就导致count的值一直是1;