来一篇关于NET的WCF中的单调服务、会话服务与单例服务
效率会有不少的变化。而实际上java是基于堆栈机器来设计,这和我们常见的基于寄存器的本地机器是差异比较大的。总体来说,这是一种虚拟机的设计思路。WCF撑持三种实例范例:PerCall、PerSession、Single。PerCall就是单调服务会为每次客户真个哀求往分派一个新的服务虚例;PerSession会为每次客户端毗连分派一个实例;Single一切的客户端会往共享一个不异的服务虚例。WCF是经由过程ServiceBehavior特征中的InstanceContextMode属性来告知服务虚例接纳那品种型,InstanceContextMode属性是一个InstanceContextMode的列举范例,InstanceContextMode有三个成员:PerCall(单调),PerSession(会话),Single(单例)。
单调服务
单调服务虚例只存在于客户真个挪用过程当中,每次客户真个一个哀求就会取得一个新的服务虚例。也就说我们在客户真个每次挪用一个办法时城市往从头前往一个新的实例给我们。上面我们看一个设置为单调服务虚例的例子。
起首看我们的服务左券,很复杂的IBehaverContract.cs:
publicinterfaceIBehaverContract
{
stringTestBehavor();
}
我们的服务虚例BehaverContract.cs为:
publicclassBehaverContract:ServiceContracts.IBehaverContract,IDisposable
{
privateint_Count=0;
publicBehaverContract()
{
Console.Write("BehaverContract.BehaverContract()");
}
publicstringTestBehavor()
{
_Count++;
returnString.Format("Thenumberis:{0}",_Count);
}
publicvoidDispose()
{
Console.Write("BehaverContract.Dispose()");
}
}
在客户端挪用:
stringstrResult=proxy.TestBehavor();
stringstrResult2=proxy.TestBehavor();
Console.Write(strResult+"n");
Console.Write(strResult2);
了局如图:
同时我们在宿主端能够监听到:
经由过程实例能够分明的看到我们挪用了两次办法,每次都是创立了一个新的实例给客户端,也就是说单调实例不克不及在客户端跟服务器端交互的时分保持某些形态。如许的形式的优点就是能够很好的往利用跟开释我们对照无限的资本,如数据毗连。单调服务创立于每一个办法挪用之前,挪用完成后会立即开释。固然压服务端在不休的创立跟烧毁服务虚例,可是服务端与客户真个代办署理的毗连是不会断开的,如许每次的创立的资本就对照少了。
会话服务
假如服务被设置为会话服务范例,那末客户端为该服务创立一个新的代办署理时,就会取得一个新的并且是本人专有的,跟其他实例有关的服务虚例。这类形式十分像典范的c/s形式,该实例一向到客户端不在必要利用时才会往开释。PerSession形式也就是相称于remoting中的客户端激活形式。
在设置公有会话时分,我们必要在服务上设置InstanceContextMode为PerSession,PerSession也是InstanceContextMode属性的默许值。设置了如许的属性时,其实不能确保我们的服务就是公有会话的,由于公有会话形式必要保持某一个客户端到服务器真个形态,以是必要客户端到服务真个毗连是耐久的。那末Http协定的无毗连就不克不及保持公有会话了,假如要基于Http的传输,WCF供应了wsHttpBinding来仿照一个耐久的传输。
在传输层的会话的同时,左券的设置也是必要的,由于在运转时WCF必要晓得服务是不是启用了会话。经由过程ServiceContract的SessionMode属性,我们能够来设定我们的左券是不是撑持会话。
SessionMode列举有三个成员:Allowed、Required、NotAllowed。SessionMode属性的默许值为SessionMode.Allowed。当我们设置为Allowed时只能代表是同意,只要当绑定是一个传输层会话时才干接纳会话服务的实行。SessionMode.Required请求必需利用传输层会话。SessionMode.NotAllowed克制利用传输层会话,也就不克不及利用使用层会话了,也就是说即便我们将InstanceContextMode属性设置为InstanceContextMode.PerSession时,它总会接纳PerCall往实行。
我们还看方才谁人的谁人例子,只是把响应的设置给修正下。起首我们将服务左券的SessionMode设置为SessionMode.Requried:
publicinterfaceIBehaverContract
然后我们将服务虚例设置为:InstanceContextMode.PerSession:
publicclassBehaverContract:ServiceContracts.IBehaverContract,IDisposable
同时我们必要在宿主中的绑定设置为撑持传输层会话的:
<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
<system.serviceModel>
<services>
<servicename="Service.BehaverContract"behaviorConfiguration="behavior">
<endpointbinding="wsHttpBinding"
contract="ServiceContracts.IBehaverContract"
address="BehaverContract"
bindingConfiguration="HttpSession">
</endpoint>
<host>
<baseAddresses>
<addbaseAddress="http://localhost:8000"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behaviorname="behavior">
<serviceMetadatahttpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<bindingname="HttpSession">
<reliableSessionenabled="true"/>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
</configuration>
客户真个挪用仍是一样的,我们看到以下的了局:
在我们启用了公有会话的时分,服务端跟客户端都能取得此次会话的一个独一的会话ID。服务能够在操纵高低文中往猎取这个ID(OperationContext.Current.SessionId),客户端能够经由过程InnerChannel.SessionId往猎取。服务端跟每一个客户真个会话保持就是经由过程这个SessionId往联系关系的。
会话通常为在客户端封闭了代办署理时才会停止,可是客户端能够强行的停止会话。每次会话余暇超不时间为10分钟。我们能够经由过程绑定设置ReliableSession的InactivityTimeout属性往设置超不时间。
单例服务
单例服务就是说一切的客户端都将毗连不异的实例,单例服务的实例性命周期是无穷的。设置时,我们只必要在将InstanceContextMode属性设置为InstanceContextMode.Single既能够。还看方才的例子,我们把服务修正成:
namespaceService
{
publicclassBehaverContract:ServiceContracts.IBehaverContract,IDisposable
{
privateint_Count=0;
publicBehaverContract()
{
Console.Write("BehaverContract.BehaverContract()n");
}
publicstringTestBehavor()
{
_Count++;
returnString.Format("Thenumberis:{0}",_Count);
}
publicvoidDispose()
{
Console.Write("BehaverContract.Dispose()n");
}
}
}
客户端:
namespaceClient
{
classProgram
{
staticvoidMain(string[]args)
{
BehaverContract.BehaverContractClientproxy=newClient.BehaverContract.BehaverContractClient();
proxy.Open();
stringstrResult=proxy.TestBehavor();
BehaverContract.BehaverContractClientproxy2=newClient.BehaverContract.BehaverContractClient();
stringstrResult2=proxy2.TestBehavor();
Console.Write(strResult+"n");
Console.Write(strResult2);
//Console.Write("nSessionIDis{0}",proxy.InnerChannel.SessionId);
proxy.Close();
Console.Read();
}
}
}
运转了局:
服务器端:
在客户端我们是用了两个代办署理,经由过程服务器真个监听和运转的了局,我们能够分明的看到单例模子完成的体例。计算机发展到这个时候,很多技术日益成熟,想学好一种技术都是不容易的,当你学会用的时候你对它的很多原理可能很不了解) 如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。 代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。 ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。 市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。 当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。 是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。 同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。
页:
[1]