コード例 #1
0
        public virtual Task <HttpResponseMessage> InvokeActionAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
        {
            if (actionContext == null)
            {
                throw Error.ArgumentNull("actionContext");
            }

            HttpActionDescriptor  actionDescriptor  = actionContext.ActionDescriptor;
            HttpControllerContext controllerContext = actionContext.ControllerContext;

            return(TaskHelpers.RunSynchronously(() =>
            {
                return actionDescriptor.ExecuteAsync(controllerContext, actionContext.ActionArguments)
                .Then(value => actionDescriptor.ResultConverter.Convert(controllerContext, value));
            }, cancellationToken)
                   .Catch <HttpResponseMessage>(info =>
            {
                // Propagate anything which isn't HttpResponseException
                HttpResponseException httpResponseException = info.Exception as HttpResponseException;
                if (httpResponseException == null)
                {
                    return info.Throw();
                }

                HttpResponseMessage response = httpResponseException.Response;
                response.EnsureResponseHasRequest(actionContext.Request);

                return info.Handled(response);
            }, cancellationToken));
        }
コード例 #2
0
        private static async Task <HttpResponseMessage> InvokeUsingActionResultAsync(HttpActionContext actionContext,
                                                                                     HttpActionDescriptor actionDescriptor, CancellationToken cancellationToken)
        {
            Contract.Assert(actionContext != null);

            HttpControllerContext controllerContext = actionContext.ControllerContext;

            object result = await actionDescriptor.ExecuteAsync(controllerContext, actionContext.ActionArguments,
                                                                cancellationToken);

            if (result == null)
            {
                throw new InvalidOperationException(SRResources.ApiControllerActionInvoker_NullHttpActionResult);
            }

            IHttpActionResult actionResult = result as IHttpActionResult;

            if (actionResult == null)
            {
                throw new InvalidOperationException(Error.Format(
                                                        SRResources.ApiControllerActionInvoker_InvalidHttpActionResult, result.GetType().Name));
            }

            HttpResponseMessage response = await actionResult.ExecuteAsync(cancellationToken);

            if (response == null)
            {
                throw new InvalidOperationException(
                          SRResources.ResponseMessageResultConverter_NullHttpResponseMessage);
            }

            response.EnsureResponseHasRequest(actionContext.Request);

            return(response);
        }
コード例 #3
0
        private static async Task <HttpResponseMessage> InvokeActionAsyncCore(HttpActionContext actionContext, CancellationToken cancellationToken)
        {
            HttpActionDescriptor actionDescriptor = actionContext.ActionDescriptor;

            Contract.Assert(actionDescriptor != null);

            HttpControllerContext controllerContext = actionContext.ControllerContext;

            Contract.Assert(controllerContext != null);

            try
            {
                object result = await actionDescriptor.ExecuteAsync(controllerContext, actionContext.ActionArguments, cancellationToken);

                // This is cached in a local for performance reasons. ReturnType is a virtual property on HttpActionDescriptor,
                // or else we'd want to cache this as part of that class.
                bool isDeclaredTypeActionResult = typeof(IHttpActionResult).IsAssignableFrom(actionDescriptor.ReturnType);
                if (result == null && isDeclaredTypeActionResult)
                {
                    // If the return type of the action descriptor is IHttpActionResult, it's not valid to return null
                    throw Error.InvalidOperation(SRResources.ApiControllerActionInvoker_NullHttpActionResult);
                }

                if (isDeclaredTypeActionResult || actionDescriptor.ReturnType == typeof(object))
                {
                    IHttpActionResult actionResult = result as IHttpActionResult;

                    if (actionResult == null && isDeclaredTypeActionResult)
                    {
                        // If the return type of the action descriptor is IHttpActionResult, it's not valid to return an
                        // object that doesn't implement IHttpActionResult
                        throw Error.InvalidOperation(SRResources.ApiControllerActionInvoker_InvalidHttpActionResult, result.GetType());
                    }
                    else if (actionResult != null)
                    {
                        HttpResponseMessage response = await actionResult.ExecuteAsync(cancellationToken);

                        if (response == null)
                        {
                            throw Error.InvalidOperation(SRResources.ResponseMessageResultConverter_NullHttpResponseMessage);
                        }

                        response.EnsureResponseHasRequest(actionContext.Request);
                        return(response);
                    }
                }

                // This is a non-IHttpActionResult, so run the converter
                return(actionDescriptor.ResultConverter.Convert(controllerContext, result));
            }
            catch (HttpResponseException httpResponseException)
            {
                HttpResponseMessage response = httpResponseException.Response;
                response.EnsureResponseHasRequest(actionContext.Request);

                return(response);
            }
        }
コード例 #4
0
        private async Task <HttpResponseMessage> InvokeActionAsyncCore(HttpActionContext actionContext, CancellationToken cancellationToken)
        {
            HttpActionDescriptor  actionDescriptor  = actionContext.ActionDescriptor;
            HttpControllerContext controllerContext = actionContext.ControllerContext;

            try
            {
                cancellationToken.ThrowIfCancellationRequested();
                object actionResult = await actionDescriptor.ExecuteAsync(controllerContext, actionContext.ActionArguments, cancellationToken);

                return(actionDescriptor.ResultConverter.Convert(controllerContext, actionResult));
            }
            catch (HttpResponseException httpResponseException)
            {
                HttpResponseMessage response = httpResponseException.Response;
                response.EnsureResponseHasRequest(actionContext.Request);

                return(response);
            }
        }
コード例 #5
0
        private static async Task <HttpResponseMessage> InvokeUsingResultConverterAsync(HttpActionContext actionContext,
                                                                                        HttpActionDescriptor actionDescriptor, CancellationToken cancellationToken)
        {
            Contract.Assert(actionContext != null);

            HttpControllerContext controllerContext = actionContext.ControllerContext;

            try
            {
                object actionResult = await actionDescriptor.ExecuteAsync(controllerContext,
                                                                          actionContext.ActionArguments, cancellationToken);

                return(actionDescriptor.ResultConverter.Convert(controllerContext, actionResult));
            }
            catch (HttpResponseException httpResponseException)
            {
                HttpResponseMessage response = httpResponseException.Response;
                response.EnsureResponseHasRequest(actionContext.Request);

                return(response);
            }
        }