/// <inheritdoc /> public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) { HttpResponse response = context.HttpContext.Response; ActionValidationModel model = GetModel(context.ActionDescriptor, context.HttpContext.RequestServices); MemoryStream buffer = null; Stream initialStream = null; if (model.BufferResponse) { buffer = new MemoryStream(); //replace the context response with our buffer initialStream = response.Body; response.Body = buffer; } //invoke the rest of the pipeline await next(); if (model.BufferResponse) { Debug.Assert(buffer != null); //reset the buffer and read out the contents buffer.Seek(0, SeekOrigin.Begin); IList <ValidationError> validationErrors = null; if (response.ContentType != null && (response.ContentType.StartsWith(Constants.ContentTypes.ApplicationJson, StringComparison.Ordinal) || response.ContentType.StartsWith(Constants.ContentTypes.TextJson, StringComparison.Ordinal))) { ResponseTypeModel responseTypeModel = model.ResponseTypes.SingleOrDefault(r => r.StatusCode == response.StatusCode); if (responseTypeModel != null) { JSchema responseSchema = SchemaGenerator.GetGeneratedSchema(responseTypeModel.Type); validationErrors = ValidationHelper.Validate(buffer, responseSchema); //reset to start of stream buffer.Seek(0, SeekOrigin.Begin); } } //copy our content to the original stream and put it back await buffer.CopyToAsync(initialStream); response.Body = initialStream; if (validationErrors != null && validationErrors.Count > 0) { throw JSchemaValidationErrorsException.Create(validationErrors); } } }
/// <inheritdoc /> public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next) { ActionValidationModel model = GetModel(context.ActionDescriptor, context.HttpContext.RequestServices); Stream originalRequestBody = null; if (model.RequestBodySchema != null) { MemoryStream buffer = new MemoryStream(); originalRequestBody = context.HttpContext.Request.Body; await context.HttpContext.Request.Body.CopyToAsync(buffer); buffer.Seek(0, SeekOrigin.Begin); IList <ValidationError> validationErrors = ValidationHelper.Validate(buffer, model.RequestBodySchema); if (validationErrors.Count > 0) { JSchemaValidationErrorsException ex = JSchemaValidationErrorsException.Create(validationErrors); context.ModelState.AddModelError( model.RequestBodyName, ex, ModelMetadataProvider.GetMetadataForType(model.RequestBodyType)); } buffer.Seek(0, SeekOrigin.Begin); context.HttpContext.Request.Body = buffer; } await next(); if (originalRequestBody != null) { context.HttpContext.Request.Body = originalRequestBody; } }