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