/// <summary> /// Executes the resource. /// </summary> /// <param name="resourceName">Name of the resource.</param> /// <param name="parameters">The parameters.</param> /// <exception cref="System.ArgumentNullException">Throws an exception if either parameter is <c>null</c>.</exception> public void ExecuteResource(string resourceName, ResourceParameters parameters) { if (string.IsNullOrEmpty(resourceName)) { throw new ArgumentNullException("resourceName"); } if (parameters == null) { throw new ArgumentNullException("parameters"); } string message; var logger = Configuration.Logger; var context = new ResourceResultContext(logger, Configuration.FrameworkProvider, Configuration.Serializer, Configuration.HtmlEncoder); // First we determine the current policy as it has been processed so far RuntimePolicy policy = DetermineAndStoreAccumulatedRuntimePolicy(RuntimeEvent.ExecuteResource); // It is possible that the policy now says Off, but if the requested resource is the default resource, then we need to make sure // there is a good reason for not executing that resource, since the default resource is the one we most likely need to set // Glimpse On in the first place. if (resourceName.Equals(Configuration.DefaultResource.Name)) { // To be clear we only do this for the default resource, and we do this because it allows us to secure the default resource the same way // as any other resource, but for this we only rely on runtime policies that handle ExecuteResource runtime events and we ignore // ignore previously executed runtime policies (most likely during BeginRequest). // Either way, the default runtime policy is still our starting point and when it says Off, it remains Off policy = DetermineRuntimePolicy(RuntimeEvent.ExecuteResource, Configuration.DefaultRuntimePolicy); } if (policy == RuntimePolicy.Off) { string errorMessage = string.Format(Resources.ExecuteResourceInsufficientPolicy, resourceName); logger.Info(errorMessage); new StatusCodeResourceResult(403, errorMessage).Execute(context); return; } var resources = Configuration.Resources.Where( r => r.Name.Equals(resourceName, StringComparison.InvariantCultureIgnoreCase)); IResourceResult result; switch (resources.Count()) { case 1: // 200 - OK try { var resource = resources.First(); var resourceContext = new ResourceContext(parameters.GetParametersFor(resource), Configuration.PersistenceStore, logger); var privilegedResource = resource as IPrivilegedResource; if (privilegedResource != null) { result = privilegedResource.Execute(resourceContext, Configuration); } else { result = resource.Execute(resourceContext); } } catch (Exception ex) { logger.Error(Resources.GlimpseRuntimeExecuteResourceError, ex, resourceName); result = new ExceptionResourceResult(ex); } break; case 0: // 404 - File Not Found message = string.Format(Resources.ExecuteResourceMissingError, resourceName); logger.Warn(message); result = new StatusCodeResourceResult(404, message); break; default: // 500 - Server Error message = string.Format(Resources.ExecuteResourceDuplicateError, resourceName); logger.Warn(message); result = new StatusCodeResourceResult(500, message); break; } try { result.Execute(context); } catch (Exception exception) { logger.Fatal(Resources.GlimpseRuntimeExecuteResourceResultError, exception, result.GetType()); } }
/// <summary> /// Executes the resource. /// </summary> /// <param name="resourceName">Name of the resource.</param> /// <param name="parameters">The parameters.</param> /// <exception cref="System.ArgumentNullException">Throws an exception if either parameter is <c>null</c>.</exception> public void ExecuteResource(string resourceName, ResourceParameters parameters) { if (string.IsNullOrEmpty(resourceName)) { throw new ArgumentNullException("resourceName"); } if (parameters == null) { throw new ArgumentNullException("parameters"); } string message; var logger = Configuration.Logger; var context = new ResourceResultContext(logger, Configuration.FrameworkProvider, Configuration.Serializer, Configuration.HtmlEncoder); IResourceResult result; var policy = GetRuntimePolicy(RuntimeEvent.ExecuteResource); if (policy == RuntimePolicy.Off && !resourceName.Equals(Configuration.DefaultResource.Name)) { message = string.Format(Resources.ExecuteResourceInsufficientPolicy, resourceName); logger.Info(message); new StatusCodeResourceResult(403, message).Execute(context); return; } var resources = Configuration.Resources.Where( r => r.Name.Equals(resourceName, StringComparison.InvariantCultureIgnoreCase)); switch (resources.Count()) { case 1: // 200 - OK try { var resource = resources.First(); var resourceContext = new ResourceContext(parameters.GetParametersFor(resource), Configuration.PersistenceStore, logger); var privilegedResource = resource as IPrivilegedResource; if (privilegedResource != null) { result = privilegedResource.Execute(resourceContext, Configuration); } else { result = resource.Execute(resourceContext); } } catch (Exception ex) { logger.Error(Resources.GlimpseRuntimeExecuteResourceError, ex, resourceName); result = new ExceptionResourceResult(ex); } break; case 0: // 404 - File Not Found message = string.Format(Resources.ExecuteResourceMissingError, resourceName); logger.Warn(message); result = new StatusCodeResourceResult(404, message); break; default: // 500 - Server Error message = string.Format(Resources.ExecuteResourceDuplicateError, resourceName); logger.Warn(message); result = new StatusCodeResourceResult(500, message); break; } try { result.Execute(context); } catch (Exception exception) { logger.Fatal(Resources.GlimpseRuntimeExecuteResourceResultError, exception, result.GetType()); } }