|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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毛病!");
}
……
运转,效果以下:
从上图的效果能够看到,客户端有准确的捕捉到服务端抛出的毛病了。前几天同学问我学习方向的问题。有点想法,不知道对不对,怕误导同学,现在“开源一下”。注:括号内是我现在整理的时填加上的。 |
|