Пример #1
0
        /// <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();
                }
            }
        }
Пример #2
0
 public void OnResourceExecuting(ResourceExecutingContext context)
 {
     context.HttpContext.Response.Headers.Append(
         "filters",
         Name + " - OnResourceExecuting");
 }
Пример #3
0
        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]);
        }
Пример #4
0
 public ResourceExecutingContext CreateResourceExecutingContext(IFilterMetadata[] filters)
 {
     var context = new ResourceExecutingContext(
         MockActionContext,
         filters);
     return context;
 }
Пример #5
0
 public void OnResourceExecuting(ResourceExecutingContext context)
 {
     _logger.LogInformation("OnResourceExecuting");
 }
Пример #6
0
        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);
        }
Пример #7
0
 /// <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
             });
     }
 }