2008-12-11 66 views
5

将web服务方法/调用包装到try/catch块中是否最佳做法?在try/catch块中包装web服务

我不Web服务请求往往是.NET桌面应用程序崩溃的原因?所以我想所有的调用都应该在try/catch中包装以防止这种情况发生。

好主意?

此外,它应该抛出一个异常或只是有一个空的catch?

回答

4

我假设你使用的是WCF,因为你的问题是用它来标记的。在使用WFC进行异常处理时,一个好的做法是不允许异常通过线路传播给消费者,但是应该抛出有意义的FaultExceptions。

如果您有任何可能产生异常的机会,您应该始终在您的操作中设置try ... catch块。如果您允许原始内容冒泡,则只会出现两种情况:如果您已配置服务以允许在故障中使用异常详细信息,那么您将暴露自己的服务内部,以防出现安全漏洞。或者你没有在你的服务中配置这个,并且消费者得到一个非常通用的消息,表明出现了问题,这对他们或支持团队来说并不是很有用。

您应该做的是声明一个或多个FaultExceptions,具体取决于您希望用户从您的操作中接收到的消息,将它们装饰为操作声明中的FaultContracts。然后你可以尝试......捕捉特定的异常并抛出特定的故障。你也可以有一个try ... catch捕获异常并抛出一个非常普遍的错误。

这里的关键是没有透露太多关于内部操作的信息 - 尤其是堆栈跟踪!

错误只是另一个数据协定,所以它在WSDL中声明。这意味着您的客户可以明确地捕捉到故障,并且可以对您的操作中出现的故障做出反应,就好像它是从代码中抛出异常一样。

希望这会有所帮助。

乔。

0

这是一个可能导致异常被抛出的情况,所以是的,它应该被包装在try catch块上。

做什么用的这取决于程序逻辑异常处理程序...

0

把Web服务方法在try catch块是一个好主意,因为你说你不想崩溃主叫应用程序,因为Web服务方法出错了。

此外,与其向客户端抛出异常,无论如何都无法对此做任何事情,您可能会考虑让所有Web服务方法返回可包含调用状态的结构或小类,错误代码和可以解释错误的友好信息。

1

是的,你应该在try-catch中包装Web服务调用。不要使用空捕获物,因为它们(大部分)都是纯粹的邪恶。你的catch块至少应该记录异常。我不知道您的应用程序逻辑,但可能会向用户显示一些消息(如“服务中的信息未因技术错误而被提取”)。

2

没关系,但试着去捕捉你可以处理的异常类型。

避免捕获任何“异常”,或者,如果您这样做,请记录和/或警告用户和/或重新尝试调用Web服务。

如果是Windows窗体应用程序,我通常会在#if DEBUG块中包装最后一个“Exception”catch以避免在调试或测试时隐藏异常。

#if !DEBUG 
catch (Exception ex) 
{ 
    // show messagebox, log, etc 
} 
#endif 
1
using System; 
using System.ServiceModel; 
using Entities; //my entities 
using AuthenticationService; //my webservice reference 

namespace Application.SL.Model 
{ 
    public class AuthenticationServiceHelper 
    { 
     /// <summary> 
     /// User log in 
     /// </summary> 
     /// <param name="callback"></param> 
     public void UserLogIn(Action<C48PR01IzhodOut, Exception> callback) 
     { 
      var proxy = new AuthenticationServiceClient(); 

     try 
     { 
      proxy.UserLogInCompleted += (sender, eventargs) => 
      { 
       var userCallback = eventargs.UserState as Action<C48PR01IzhodOut, Exception>; 
       if (userCallback == null) 
        return; 

       if (eventargs.Error != null) 
       { 
        userCallback(null, eventargs.Error); 
        return; 
       } 
       userCallback(eventargs.Result, null); 
      }; 
      proxy.UserLogInAsync(callback); 
     } 
     catch (Exception ex) 
     { 
      proxy.Abort(); 
      ErrorHelper.WriteErrorLog(ex.ToString()); 
     } 
     finally 
     { 
      if (proxy.State != CommunicationState.Closed) 
      { 
       proxy.CloseAsync(); 
      } 
     } 
     } 
} 

这是一个很好的做法还是有改进的空间?