仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1773|回复: 12
打印 上一主题 下一主题

[学习教程] ASP.NET网页设计WCF中的Dispose仓酷云

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:20:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
不可能天天有学习.net),我一同学说,你应该早就有作品啦。我惶惶然……在我翻译的InfoQ旧事《WCF的成绩和Using语句块》中提到了开释客户端资本(个中包含端口、通道)和封闭毗连的成绩。旧事并没有很深切地会商,以是我想再增补一些内容。
毫无疑问,在.NETFramework中,一个资本(特别长短托管资本)一般都必要完成IDisposable接口。一旦完成了该接口,我们就能够利用using语句来办理资本,这是最便利的体例。可是,一旦在using语句中抛出了非常,便可能不会准确完成资本的接纳,特别是毗连,极可能会一向翻开,既占用了通道和端口,还大概呈现资本的华侈,从而影响体系的功能和不乱性。
微软保举的最好理论是丢弃using语句,转而使用try/catch(/finally)语句。它请求在try语句中挪用Close()办法,而在catch中挪用Abort()办法。在旧事中已申明了Close()与Abort()办法的区分,即后者能够强迫地封闭客户端,包含封闭客户端毗连,开释资本。因为Close()办法大概会抛出CommunicationException和TimeoutException非常,一般的客户端代码应当是如许:
varmyClient=newMyClient();
try
{
//其他代码
myClient.Close();
}
catch(CommunicationException)
{
myClient.Abort();
}
catch(TimeoutException)
{
myClient.Abort();
}
catch(Exception)
{
myClient.Abort();
throw;
}
在最初增添对Exception非常的捕捉很有需要,由于我们不晓得Close()办法会否抛出某些不成预知的非常,比方OutOfMemoryException等。旧事中提到SteveSmith的办法实在就是对这段冗杂代码的封装,封装体例是接纳扩大办法,扩大的范例为ICommunicationObject。这是由于一切的客户端对象都完成了ICommunicationObject接口。以下是SteveSmith的扩大办法代码:
publicstaticclassExtensions
{
publicstaticvoidCloseConnection(thisICommunicationObjectmyServiceClient)
{
if(myServiceClient.State!=CommunicationState.Opened)
{
return;
}
try
{
myServiceClient.Close();
}
catch(CommunicationExceptionex)
{
Debug.Print(ex.ToString());
myServiceClient.Abort();
}
catch(TimeoutExceptionex)
{
Debug.Print(ex.ToString());
myServiceClient.Abort();
}
catch(Exceptionex)
{
Debug.Print(ex.ToString());
myServiceClient.Abort();
throw;
}
}
}
使用该扩大办法,在本应挪用Close()办法的中央,取代为CloseConnection()办法,就能够制止写冗杂的catch代码。而利用Lambda表达式的体例能够说是独辟门路,利用起来与using语法大抵靠近。完成办法是界说一个静态办法,并承受一个ICommunicationObject对象与Action托付:
publicclassUtil
{
publicstaticvoidUsing<T>(Tclient,Actionaction)
whereT:ICommunicationObject
{
try
{
action(client);
client.Close();
}
catch(CommunicationException)
{
client.Abort();
}
catch(TimeoutException)
{
client.Abort();
}
catch(Exception)
{
client.Abort();
throw;
}
}
}
利用时,能够将底本的客户端代码作为Action托付的Lambda表达式传送给Using办法中:
Util.Using(newMyClient(),client=>
{
client.SomeWCFOperation();
//其他代码;
});
另有一种办法是界说一个本人的ChannelFactory,让实在现IDisposable接口,并作为ChannelFactory的Wrapper类。在该类中界说Close()和Dispose()办法时,思索到非常抛出的情形,并在非常抛出时挪用Abort()办法。如许我们就能够在using中利用自界说的ChannelFactory类。比方:
publicclassMyChannelFactory:IDisposable
{
privateChannelFactorym_innerFactory;
publicMyChannelFactory(ChannelFactoryfactory)
{
m_innerFactory=factory;
}
~MyChannelFactory()
{
Dispose(false);
}
publicvoidClose()
{
Close(TimeSpan.FromSeconds(10));
}
publicvoidClose(TimeSpanspan)
{
if(m_innerFactory!=null)
{
if(m_innerFactory.State!=CommunicationState.Opened)
{
return;
}
try
{
m_innerFactory.Close(span);
}
catch(CommunicationException)
{
m_innerFactory.Abort();
}
catch(TimeOutException)
{
m_innerFactory.Abort();
}
catch(Exception)
{
m_innerFactory.Abort();
throw;
}
}
}
privatevoidDispose(boolingdisposing)
{
if(disposing)
{
Close();
}
}
voidIDisposable.Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
实在,旧事中提到接纳代办署理形式的体例与此完成不异。总之,万变不离其宗,一切替换计划的计划实质都是对冗杂的try/catch/finally的一次包装,从而无效地完成重用,包管体系的平安、功能与不乱性。
以前很热炒跨平台,主要是由于硅谷挑战微软霸主地位的热情,但是冷静下来后,跨平台往往不是那么一回事。假设你有个软件,所谓的跨平台,你只需要为第二个平台上重新编译一次就行了,这样很难么?
深爱那片海 该用户已被删除
沙发
发表于 2015-1-20 20:50:39 | 只看该作者
是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。
灵魂腐蚀 该用户已被删除
板凳
发表于 2015-1-29 23:43:20 | 只看该作者
有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。
第二个灵魂 该用户已被删除
地板
发表于 2015-2-3 21:00:38 | 只看该作者
ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
愤怒的大鸟 该用户已被删除
5#
发表于 2015-2-9 04:57:46 | 只看该作者
这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。
活着的死人 该用户已被删除
6#
发表于 2015-2-11 03:15:57 | 只看该作者
主流网站开发语言之PHPHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。
若相依 该用户已被删除
7#
发表于 2015-2-13 05:50:01 | 只看该作者
碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。
莫相离 该用户已被删除
8#
发表于 2015-2-17 17:20:45 | 只看该作者
业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。
9#
发表于 2015-2-20 16:59:51 | 只看该作者
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
老尸 该用户已被删除
10#
发表于 2015-3-6 17:34:45 | 只看该作者
关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。
飘飘悠悠 该用户已被删除
11#
发表于 2015-3-12 11:35:14 | 只看该作者
最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
飘灵儿 该用户已被删除
12#
发表于 2015-3-13 11:09:55 | 只看该作者
ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。
冷月葬花魂 该用户已被删除
13#
发表于 2015-3-19 21:28:10 | 只看该作者
微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。
精灵巫婆 该用户已被删除
14#
发表于 2015-4-3 05:45:24 | 只看该作者
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 05:00

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表