/// <summary> /// As a <see cref="IResourceFilter"/>, this filter looks at the request and rejects it before going ahead if /// 1. The format in the request does not match any format in the map. /// 2. If there is a conflicting producesFilter. /// </summary> /// <param name="context">The <see cref="ResourceExecutingContext"/>.</param> public void OnResourceExecuting(ResourceExecutingContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } var format = GetFormat(context); if (format == null) { // no format specified by user, so the filter is muted return; } var contentType = _options.FormatterMappings.GetMediaTypeMappingForFormat(format); if (contentType == null) { // no contentType exists for the format, return 404 context.Result = new HttpNotFoundResult(); return; } // Determine media types this action supports. var responseTypeFilters = context.Filters.OfType<IApiResponseMetadataProvider>(); var supportedMediaTypes = new List<MediaTypeHeaderValue>(); foreach (var filter in responseTypeFilters) { filter.SetContentTypes(supportedMediaTypes); } // Check if support is adequate for requested media type. if (supportedMediaTypes.Count != 0) { // We need to check if the action can generate the content type the user asked for. That is, treat the // request's format and IApiResponseMetadataProvider-provided content types similarly to an Accept // header and an output formatter's SupportedMediaTypes: Confirm action supports a more specific media // type than requested e.g. OK if "text/*" requested and action supports "text/plain". if (!supportedMediaTypes.Any(c => c.IsSubsetOf(contentType))) { context.Result = new HttpNotFoundResult(); } } }
public void OnResourceExecuting(ResourceExecutingContext context) { context.HttpContext.Response.Headers.Append( "filters", Name + " - OnResourceExecuting"); }
public void FormatFilter_ContextContainsFormat_InRouteAndQueryData() { // If the format is present in both route and query data, the one in route data wins // Arrange var mediaType = MediaTypeHeaderValue.Parse("application/json"); var mockObjects = new MockObjects("json", FormatSource.RouteData); var httpContext = new Mock<HttpContext>(); // Query contains xml httpContext.Setup(c => c.Request.Query.ContainsKey("format")).Returns(true); httpContext.Setup(c => c.Request.Query["format"]).Returns("xml"); // Routedata contains json var data = new RouteData(); data.Values.Add("format", "json"); var ac = new ActionContext(httpContext.Object, data, new ActionDescriptor()); var resultExecutingContext = new ResultExecutingContext( ac, new IFilterMetadata[] { }, new ObjectResult("Hello!"), controller: new object()); var resourceExecutingContext = new ResourceExecutingContext( ac, new IFilterMetadata[] { }); var filter = new FormatFilter(mockObjects.OptionsManager, mockObjects.ActionContextAccessor); // Act filter.OnResourceExecuting(resourceExecutingContext); filter.OnResultExecuting(resultExecutingContext); // Assert var objectResult = Assert.IsType<ObjectResult>(resultExecutingContext.Result); Assert.Equal(1, objectResult.ContentTypes.Count); AssertMediaTypesEqual(mediaType, objectResult.ContentTypes[0]); }
public ResourceExecutingContext CreateResourceExecutingContext(IFilterMetadata[] filters) { var context = new ResourceExecutingContext( MockActionContext, filters); return context; }
public void OnResourceExecuting(ResourceExecutingContext context) { _logger.LogInformation("OnResourceExecuting"); }
public void FormatFilter_ExplicitContentType_SetOnResponse_TakesPrecedence() { // Arrange var mediaType = MediaTypeHeaderValue.Parse("application/foo"); var mockObjects = new MockObjects("json", FormatSource.QueryData); var response = new Mock<HttpResponse>(); response.Setup(r => r.ContentType).Returns("application/foo"); var httpContext = new Mock<HttpContext>(); httpContext.Setup(c => c.Response).Returns(response.Object); httpContext.Setup(c => c.Request.Query["format"]).Returns("json"); var actionContext = new ActionContext(httpContext.Object, new RouteData(), new ActionDescriptor()); var resultExecutingContext = new ResultExecutingContext( actionContext, new IFilterMetadata[] { }, new ObjectResult("Hello!"), controller: new object()); var resourceExecutingContext = new ResourceExecutingContext( actionContext, new IFilterMetadata[] { }); var filter = new FormatFilter(mockObjects.OptionsManager); // Act filter.OnResourceExecuting(resourceExecutingContext); filter.OnResultExecuting(resultExecutingContext); // Assert var result = Assert.IsType<ObjectResult>(resultExecutingContext.Result); Assert.Equal(0, result.ContentTypes.Count); }
/// <inheritdoc /> public void OnResourceExecuting(ResourceExecutingContext context) { }
public static void BeforeOnResourceExecution( this DiagnosticSource diagnosticSource, ResourceExecutingContext resourceExecutingContext, IAsyncResourceFilter filter) { if (diagnosticSource.IsEnabled("Microsoft.AspNet.Mvc.BeforeOnResourceExecution")) { diagnosticSource.Write( "Microsoft.AspNet.Mvc.BeforeOnResourceExecution", new { actionDescriptor = resourceExecutingContext.ActionDescriptor, resourceExecutingContext = resourceExecutingContext, filter = filter }); } }