/// <summary> /// Perform the inspection asynchronously. /// </summary> /// <param name="actionContext">an HttpActionContext</param> /// <param name="cancellationToken">a CancellationToken </param> /// <returns></returns> public Task<HttpResponseMessage> InvokeActionAsync(HttpActionContext actionContext, CancellationToken cancellationToken) { if (actionContext.Request.IsInspectRequest()) { var inspectData = new InspectData(actionContext.Request); inspectData.RealHttpStatus = HttpStatusCode.OK; return Task.FromResult<HttpResponseMessage>(actionContext.Request.CreateResponse<InspectData>( HttpStatusCode.OK, inspectData)); } else { return _innerInvoker.InvokeActionAsync(actionContext, cancellationToken); } }
/// <summary> /// /// </summary> /// <param name="request"></param> /// <param name="cancellationToken"></param> /// <returns></returns> protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (request.IsInspectRequest()) { var config = GlobalConfiguration.Configuration; request.Properties[RequestHelper.RouteDataCache] = new RouteDataInfo { RouteTemplate = request.GetRouteData().Route.RouteTemplate, Data = request.GetRouteData().Values.Select(pair => new KeyValuePair<string, string>(pair.Key, pair.Value.ToString())).ToArray() }; request.Properties[RequestHelper.RoutesCache] = config.Routes.Select(route => new RouteInfo { RouteTemplate = route.RouteTemplate, Defaults = route.Defaults != null ? route.Defaults.Select(pair => new KeyValuePair<string, string>(pair.Key, pair.Value.ToString())).ToArray() : null, Constraints = route.Constraints != null ? route.Constraints.Select(pair => new KeyValuePair<string, string>(pair.Key, pair.Value.ToString())).ToArray() : null, DataTokens = route.DataTokens != null ? route.DataTokens.Select(pair => new KeyValuePair<string, string>(pair.Key, pair.Value.ToString())).ToArray() : null, Handler = route.Handler != null ? route.Handler.GetType().Name : null, Picked = route.RouteTemplate == request.GetRouteData().Route.RouteTemplate }).ToArray(); var response = await base.SendAsync(request, cancellationToken); if (response.StatusCode != HttpStatusCode.OK) { var newRequest = response.RequestMessage; var inspectData = new InspectData(newRequest); inspectData.RealHttpStatus = response.StatusCode; response = newRequest.CreateResponse<InspectData>(HttpStatusCode.OK, inspectData); } response.Headers.Add(RequestHelper.InspectHeaderName, "done"); return response; } return await base.SendAsync(request, cancellationToken); }