Захватывать Ошибки в моем Behaviour в WCF - C#

У меня есть достаточно передовой проект Backend, где я был должен реализовывать Behaviour, чтобы мочь контролировать несколько вещей призывов к внешней API.

Все было в порядке, и я смог унифицировать в том же сайте этот контроль для всех вызовов, которые делаются без необходимости менять код на все сайты, где делаются эти вызовы.

Проблема - что ошибки не быть захваченными 404 например, или 500.

Это мой код:

Здесь он был бы примером призыва к внешней API:

protected virtual Vendor.Sinacofi.SinacofiService.RespuestaSNPV1201 RequestToVendor(VendorWebService vendor, string clientFiscalId, BasicSearchCriterion criteria)
{
    Vendor.Sinacofi.SinacofiService.RespuestaSNPV1201 result;

    try
    {
       using (Vendor.Sinacofi.SinacofiService.SNPV1201SoapClient client = new Vendor.Sinacofi.SinacofiService.SNPV1201SoapClient())
        {
        /*Credentials*/
        result = client.ConsultaRutificacion();
        }
    return result;
    }
    catch (Exception ex)
    {
        // control error
    }

И здесь два необходимых файла моего Behaviour (я опускаю конфигурацию XML)

namespace SIPE.Search.Helpers
{
    /// <summary>
    /// Implements methods that can be used to extend run-time behavior for an endpoint in either a client application.
    /// </summary>
    public class ExternalClientBehavior : BehaviorExtensionElement
    {
        protected override object CreateBehavior()
        {
            return new ExternalClientBehaviorClass();
        }

        public override Type BehaviorType
        {
            get
            {
                return typeof(ExternalClientBehaviorClass);
            }
        }

        /// <summary>
        /// JSON REST[GET] Converter Behavior
        /// </summary>
        private class ExternalClientBehaviorClass : IEndpointBehavior
        {
            public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
            {                
            }

            public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
            {
                ExternalClientMessageInspector clientInspector = new ExternalClientMessageInspector(endpoint);
                clientRuntime.MessageInspectors.Add(clientInspector);

                foreach (ClientOperation op in clientRuntime.Operations)
                {
                    op.ParameterInspectors.Add(clientInspector);
                }
            }

            public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
            {
                endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(new ExternalClientMessageInspector(endpoint));
            }

            public void Validate(ServiceEndpoint endpoint)
            {

            }
        }

    }
}

И где я реализую вещи, которые я хочу, и где мне нравился бы мочь захватывать ошибки 404, реализовав ее названные, и другие.

namespace SIPE.Search.Helpers
{
    /// <summary>
    /// Intercepts send requests. 
    /// </summary>
    public class ExternalClientMessageInspector : IClientMessageInspector, IParameterInspector, IErrorHandler
    {
        private ServiceEndpoint Endpoint { get; set; }

        Dictionary<string, object> inputsParam;

        public ExternalClientMessageInspector(ServiceEndpoint endpoint)
        {
            //empty
        }

        public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
        {
            ((Dictionary<string, string>)(System.Web.HttpContext.Current.Items[operationName])).Add("OutputParam", JsonConvert.SerializeObject(returnValue));

        }

        public void AfterReceiveReply(ref Message reply, object correlationState)
        {
            //code not necessary
        }

        public object BeforeCall(string operationName, object[] inputs)
        {
            // code not neccesary
        }

        public object BeforeSendRequest(ref Message request, IClientChannel channel)
        {
            MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
            Message copy = buffer.CreateMessage();  // Create a copy to work with
            request = buffer.CreateMessage();         // Restore the original message

            return copy.GetReaderAtBodyContents().Name;
        }

        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            // no implement
        }

        public bool HandleError(Exception error)
        {
            // no implement
            return true;
        }

        public void NotifyError()
        {

        }
    }
}

Прямо сейчас ошибки прибывают в Excepction метода RequestToVEndor, но как я говорю, что я не хочу сделать это там, так как он был бы должен делать то же самое в очень большом количестве других сайтов.

Посмотрим вы можете бросать мне руку, так как я уверен, что нет какой-то основной вещи.

Спасибо

Я издаю, чтобы добавлять мой файл config Behaviour, так как я думаю, что где-то здесь также может быть проблема:

<?xml version="1.0" encoding="utf-8"?>
<behaviors>
  <endpointBehaviors>
    <!-- SPECIFIC BEHAVIOR EXTENSION FOR JSON URL DESERIALIZER-->
    <behavior name="ServiceRESTBehavior">
      <ConverterWebHttpBehaviourExtension />
    </behavior>
    <behavior name="ServiceSOAPBehavior" />
    <behavior name="ExternalDependencyBehavior">
      <ExternalClientBehavior/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="DefaultBehaviour">
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>  
</behaviors>
5
задан 01.04.2019, 04:08
0 ответов