Should I transfer all WCF service code to a catch try block?

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); } 

Should I wrap everything in a try-catch or what do you recommend? I use WCF with the rest of the JSON services.

+6
source share
1 answer

you could do it, but it would probably be better to implement IErrorHandler and add it as a behavior to your service that will allow you to handle unhandled exceptions in one place, so you can create an error exception to return data to users.

 ErrorHandler : IErrorHandler { ... just implement the handling of errors here, however you want to handle them } 

then to create a behavior that uses this:

 /// <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 } 

Then, if you are a self-hosting, you can simply add the behavior programmatically:

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

if you want to add it through the configuration, you will need one of them:

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

and then configuration:

 <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> 

+15
source

Source: https://habr.com/ru/post/913990/


All Articles