private static HttpContext GetHttpContext(HttpRequestMessage request)
        {
            var context = request.GetProperty <HttpContext>(nameof(HttpContext));

            if (context == null)
            {
                var message = ShimResources.FormatHttpRequestMessage_MustHaveHttpContext(
                    nameof(HttpRequestMessage),
                    "HttpRequestMessageHttpContextExtensions.GetHttpRequestMessage");
                throw new InvalidOperationException(message);
            }

            return(context);
        }
        /// <summary>
        /// Helper method that creates a <see cref="HttpResponseMessage"/> with an <see cref="ObjectContent{T}"/>
        /// instance containing the provided <paramref name="value"/>. The given <paramref name="mediaType"/> is used
        /// to find an instance of <see cref="MediaTypeFormatter"/>.
        /// </summary>
        /// <typeparam name="T">The type of the value.</typeparam>
        /// <param name="request">The request.</param>
        /// <param name="statusCode">The status code of the created response.</param>
        /// <param name="value">The value to wrap. Can be <c>null</c>.</param>
        /// <param name="mediaType">
        /// The media type used to look up an instance of <see cref="MediaTypeFormatter"/>.
        /// </param>
        /// <returns>A response wrapping <paramref name="value"/> with <paramref name="statusCode"/>.</returns>
        public static HttpResponseMessage CreateResponse <T>(
            this HttpRequestMessage request,
            HttpStatusCode statusCode,
            T value,
            MediaTypeHeaderValue mediaType)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            if (mediaType == null)
            {
                throw new ArgumentNullException(nameof(mediaType));
            }

            var context = GetHttpContext(request);

            // Get the default formatters from options
            var options    = context.RequestServices.GetRequiredService <IOptions <WebApiCompatShimOptions> >();
            var formatters = options.Value.Formatters;

            var formatter = formatters.FindWriter(typeof(T), mediaType);

            if (formatter == null)
            {
                var message = ShimResources.FormatHttpRequestMessage_CouldNotFindMatchingFormatter(
                    mediaType.ToString(),
                    value.GetType());
                throw new InvalidOperationException(message);
            }

            return(request.CreateResponse(statusCode, value, formatter, mediaType));
        }