private ServiceUnitResponse ExecuteInternal(ServiceUnitContext suContext, IUriProcessResolver resolver)
        {
            var executionType            = resolver.GetExecutionType(suContext);
            ServiceUnitResponse response = null;

            if (executionType == null)
            {
                response = new ServiceUnitResponse(HttpStatusCode.NotFound);
                HandleError(suContext, resolver, response);
                return(response);
            }

            var instance = resolver.CreateInstance(suContext, executionType);

            if (instance == null)
            {
                response = new ServiceUnitResponse(HttpStatusCode.NotFound);
                HandleError(suContext, resolver, response);
                return(response);
            }

            var action = resolver.GetAction(suContext, instance);

            if (action == null)
            {
                response = new ServiceUnitResponse(HttpStatusCode.NotFound);
                HandleError(suContext, resolver, response);
                return(response);
            }

            try
            {
                response = resolver.InvokeAction(suContext, action);
                if (response == null)
                {
                    return(new ServiceUnitResponse(HttpStatusCode.NotFound));
                }

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    HandleError(suContext, resolver, response);
                }
            }
            catch (Exception ex)
            {
                WriteErrorLog(suContext, ex);
                return(HandleError(suContext, resolver, new ServiceUnitResponse(HttpStatusCode.InternalServerError)
                {
                    Data = ex
                }));
            }

            return(response);
        }
 private ServiceUnitResponse HandleError(ServiceUnitContext context,
                                         IUriProcessResolver resolver,
                                         ServiceUnitResponse response)
 {
     if (resolver != null)
     {
         foreach (var handler in resolver.HandleErrorPipeline)
         {
             handler.Invoke(context, response);
         }
     }
     return(response);
 }