仓酷云

标题: WCF中怎样准确的获捕服务端抛出的毛病 [打印本页]

作者: 小魔女    时间: 2015-1-16 14:19
标题: WCF中怎样准确的获捕服务端抛出的毛病
感觉很多控件都必须自己去写代码;用了WebMatrix感觉也不是很好,毕竟没有很强的WYSIWYG效果。现在就不知道如何是好了。在WCF中,在服务器抛出的任何非常,假如未做出格处置,在客户端都只能被FaultException捕捉,好比以下示例:

声明左券
[ServiceContract]
publicinterfaceIMyContract
{
[OperationContract]
doubleDivision(doublex,doubley);
}

完成服务
[ServiceBehavior(IncludeExceptionDetailInFaults=true)]
publicclassMyContract:IMyContract
{
publicdoubleDivision(doublex,doubley)
{
thrownewDivideByZeroException("除数不克不及为零啦!");
}
}

投止服务
classProgram
{
staticvoidMain(string[]args)
{
ServiceHosthost=newServiceHost(typeof(MyContract));
host.AddServiceEndpoint(typeof(IMyContract),newWSHttpBinding(),"http://localhost:8010");
host.Opened+=delegate{Console.WriteLine("服务已开启!");};
host.Open();

Console.ReadLine();
}
}

客户端
staticvoidMain(string[]args)
{
ChannelFactory<Host.IMyContract>channel=newChannelFactory<Host.IMyContract>();
channel.Endpoint.Binding=newWSHttpBinding();
channel.Endpoint.Address=newEndpointAddress("http://localhost:8010");
Host.IMyContractclient=channel.CreateChannel();
try
{
client.Division(1,2);
}
catch(DivideByZeroExceptionex)
{
Console.WriteLine("我是DivideByZeroException毛病!我的毛病信息是:{0}",ex.Message);
}
catch(FaultExceptionex)
{
Console.WriteLine("我是FaultException毛病!");
}

Console.ReadLine();
}

运转效果以下:
WCF中怎样准确的获捕服务端抛出的毛病
登录/注册后可看大图



从运转效果上我们能够发明,固然我们在服务端抛出了DivideByZeroException非常,但在端客户却不克不及被DivideByZeroException捕获,而是被FaultException捕获了,这是由于在WCF中,假如间接抛出非常而不界说毛病左券的话,客户端是不会晓得毛病的详细范例的,为了使客户端与服务器解耦,一切间接抛出的毛病都以FaultException抵达客户端。

那末要怎样才干让客户端明白的晓得服务端抛出的非常呢?这就必要用到毛病左券了,也就是在界说左券的时分,我们就必要界说在完成该左券的办法中会抛出甚么样的非常。界说毛病左券很复杂,只必要在办法的下面加上FaultContract属性便可,以下代码:
[ServiceContract]
publicinterfaceIMyContract
{
[OperationContract]
[FaultContract(typeof(DivideByZeroException))]
doubleDivision(doublex,doubley);
}
我们能够为一个办法界说多个毛病,但假如有界说了毛病,就必需在前面的完成中抛出如许的毛病。注重,定了IsOneWay=true的办法是不克不及够界说毛病左券的,假如一个办法同时界说了IsOneWay=true与毛病左券,就会在运转时提醒InvalidOperateionException非常。由于很复杂,IsOneWay=true就界说了该办法为单向操纵,不必要守候服务真个呼应,然后却又界说前往的毛病范例,这本就是冲突的。

然后在服务的Division办法中抛出DivideByZeroException非常,以下:
[ServiceBehavior(IncludeExceptionDetailInFaults=true)]
publicclassMyContract:IMyContract
{
publicdoubleDivision(doublex,doubley)
{
thrownewFaultException<DivideByZeroException>(newDivideByZeroException("除数不克不及为零啦!"));
}
}

注重,下面我们不是间接抛出DivideByZeroException非常了,而是利用了FaultException<T>。
客户端也稍作修正以下:
……
try
{
client.Division(1,2);
}
catch(FaultException<DivideByZeroException>ex)
{
Console.WriteLine("我是DivideByZeroException毛病!我的毛病信息是:{0}",ex.Detail.Message);
}
catch(FaultExceptionex)
{
Console.WriteLine("我是FaultException毛病!");
}
……

运转,效果以下:
WCF中怎样准确的获捕服务端抛出的毛病
登录/注册后可看大图



从上图的效果能够看到,客户端有准确的捕捉到服务端抛出的毛病了。前几天同学问我学习方向的问题。有点想法,不知道对不对,怕误导同学,现在“开源一下”。注:括号内是我现在整理的时填加上的。
作者: 透明    时间: 2015-1-18 12:53
PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。
作者: 谁可相欹    时间: 2015-1-24 16:37
大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。
作者: 小妖女    时间: 2015-2-2 11:25
ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。
作者: 变相怪杰    时间: 2015-2-7 19:05
ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。
作者: 深爱那片海    时间: 2015-2-23 06:00
如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。
作者: admin    时间: 2015-3-7 07:19
主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
作者: 金色的骷髅    时间: 2015-3-14 16:30
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
作者: 山那边是海    时间: 2015-3-21 13:13
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2