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