加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 我应该将所有WCF服务代码包装在try catch块中吗?

发布时间:2020-12-15 18:28:19 所属栏目:百科 来源:网络整理
导读:try{ ///// here is the code that might throw erros. If I discover the user is unauthorized I throw a WebFaultException myself to alert the client} catch (WebFaultException ex){ throw ex; //but if I wrap all code in try-catch,I have to reth
try
{
    ///// here is the code that might throw erros. If I discover the user is unauthorized I throw a WebFaultException myself to alert the client
}      
catch (WebFaultException ex)
{
    throw ex; //but if I wrap all code in try-catch,I have to rethrow the exception o the status code reaches the client
}
catch (Exception ex)
{
    throw new WebFaultException(ex.Message,HttpStatusCode.InternalServerError);
}

我应该把所有东西都包在试试中吗,或者你推荐什么?我使用WCF和rest-ful JSON服务

解决方法

你可以做到,但最好将 IErrorHandler和 add it as a behaviour实现到你的服务,这将允许你在一个地方处理未处理的异常,这样你就可以在那里创建一个故障异常,将细节返回到用户.
ErrorHandler : IErrorHandler
{
... just implement the handling of errors here,however you want to handle them
}

然后创建一个使用它的行为:

/// <summary>
///   Custom WCF Behaviour for Service Level Exception handling.
/// </summary>
public class ErrorHandlerBehavior : IServiceBehavior
    {
    #region Implementation of IServiceBehavior


    public void Validate (ServiceDescription serviceDescription,ServiceHostBase serviceHostBase)
        {
        }


    public void AddBindingParameters (ServiceDescription serviceDescription,ServiceHostBase serviceHostBase,Collection<ServiceEndpoint> endpoints,BindingParameterCollection bindingParameters)
        {
        }


    public void ApplyDispatchBehavior (ServiceDescription serviceDescription,ServiceHostBase serviceHostBase)
        {
        IErrorHandler errorHandler = new ErrorHandler ();

        foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
            {
            var channelDispatcher = channelDispatcherBase as ChannelDispatcher;

            if (channelDispatcher != null)
                {
                channelDispatcher.ErrorHandlers.Add (errorHandler);
                }
            }
        }

    #endregion
    }

然后,如果您是自托管,您只需以编程方式添加行为:

myServiceHost.Description.Behaviors.Add (new ErrorHandlerBehavior ());

如果你想通过配置添加它,那么你需要其中一个:

public class ErrorHandlerElement : BehaviorExtensionElement
    {
    public override Type BehaviorType
        {
        get { return typeof (ErrorHandlerBehavior); }
        }

    protected override object CreateBehavior ()
        {
        return new ErrorHandlerBehavior ();
        }
    }
}

然后是配置:

<system.serviceModel>
<extensions>
  <behaviorExtensions>
    <add name="ErrorLogging" type="ErrorHandlerBehavior,ErrorHandling,Version=1.0.0.0,Culture=neutral,PublicKeyToken=<whatever>" />
  </behaviorExtensions>
</extensions>
<bindings>
  <basicHttpBinding>
    <binding name="basicBinding">
    </binding>
  </basicHttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="Service1Behavior" name="Service">
    <endpoint address="" binding="basicHttpBinding"  bindingConfiguration="basicBinding" contract="Service" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="Service1Behavior">
      <serviceMetadata httpGetUrl="" httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
      <ErrorLogging />  <--this adds the behaviour to the service behaviours -->
    </behavior>
  </serviceBehaviors>
</behaviors>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读