仓酷云

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

[学习教程] WCF中怎样准确的获捕服务端抛出的毛病

[复制链接]
小魔女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:19:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
感觉很多控件都必须自己去写代码;用了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();
}

运转效果以下:



从运转效果上我们能够发明,固然我们在服务端抛出了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毛病!");
}
……

运转,效果以下:



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

本版积分规则

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

GMT+8, 2024-12-23 21:26

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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