예제 #1
0
        public async Task <HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func <Task <HttpResponseMessage> > continuation)
        {
            // 1. Stuff you do here will happen before the controller action method
            HttpResponseMessage response = null;

            Debug.WriteLine("VersionCheckFilter: Before controller method");
            var keyVersion = actionContext.Request.Headers.FirstOrDefault(v => v.Key == "x-version");

            if (keyVersion.Key != null)
            {
                var s = keyVersion.Value.FirstOrDefault();
                if (s.Equals("42"))
                {
                    // 2. Now we send the request to the next link in the chain of filters
                    // (or to the controller if we are at the end)
                    response = await continuation();
                }
            }
            if (response == null)
            {
                var result = new StatusCodeResult((HttpStatusCode)418, actionContext.Request);
                response = await result.ExecuteAsync(cancellationToken);
            }
            // 3. Stuff you do here will happen after the controller action method
            Debug.WriteLine("VersionCheckFilter: After controller method");
            // 4. Return response thereby continuing back up the chain of filters
            return(response);
        }
예제 #2
0
        protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            // 1. Stuff you do here happens before request reaches controller - and filters
            HttpResponseMessage response = null;

            Debug.WriteLine("First delegating handler - before filters and controller");
            var keyVersion = request.Headers.FirstOrDefault(v => v.Key == "x-version");

            if (keyVersion.Key != null)
            {
                var s = keyVersion.Value.FirstOrDefault();
                if (s.Equals("42"))
                {
                    // 2. Call the next link in the chain
                    response = await base.SendAsync(request, cancellationToken);
                }
            }
            if (response == null)
            {
                var result = new StatusCodeResult((HttpStatusCode)418, request);
                response = await result.ExecuteAsync(cancellationToken);
            }
            // 3. Stuff you do here happens after request reaches controller - and filters
            Debug.WriteLine("First delegating handler - after filters and controller");
            // 4. Return a response to client
            return(response);
        }
예제 #3
0
    public void StatusCodeResult_ExecuteResultSetsResponseStatusCode()
    {
        // Arrange
        var result = new StatusCodeResult(StatusCodes.Status404NotFound);

        var httpContext = GetHttpContext();

        // Act
        result.ExecuteAsync(httpContext);

        // Assert
        Assert.Equal(StatusCodes.Status404NotFound, httpContext.Response.StatusCode);
    }
예제 #4
0
        protected override async Task <HttpResponseMessage> SendAsync(
            HttpRequestMessage request,
            CancellationToken cancellationToken)
        {
            HttpResponseMessage response = null;

            // Do we have any X-Version headers?
            if (request.Headers.Any(h => h.Key == "X-Version"))
            {
                // Grab first X-Version header
                var versionHeader = request.Headers.First(h => h.Key == "X-Version");

                // Grab first value of that X-Version header
                var version = versionHeader.Value.FirstOrDefault();

                // Is that value equal to our magic version value?
                if (version != null && version == "42")
                {
                    // Execute remainder of chain, thus generating a response
                    response = await base.SendAsync(request, cancellationToken);
                }
            }

            // If we get here, the version header was incorrect or missing, so create
            // a response saying "I'm a teapot" (we like confusing errors)
            if (response == null)
            {
                // Create a response by using the built-in StatusCodeResult class
                var result = new StatusCodeResult((HttpStatusCode)418, request);
                response = await result.ExecuteAsync(cancellationToken);
            }

            // Return response, which will either be result of invoking rest of chain
            // or our error response
            return(response);
        }