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