Improve logging - output formatter selection
This commit is contained in:
parent
49bdcfb150
commit
276c1e4360
|
|
@ -78,6 +78,8 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_logger.RegisteredOutputFormatters(formatters);
|
||||||
|
|
||||||
var request = context.HttpContext.Request;
|
var request = context.HttpContext.Request;
|
||||||
var acceptableMediaTypes = GetAcceptableMediaTypes(request);
|
var acceptableMediaTypes = GetAcceptableMediaTypes(request);
|
||||||
var selectFormatterWithoutRegardingAcceptHeader = false;
|
var selectFormatterWithoutRegardingAcceptHeader = false;
|
||||||
|
|
@ -95,6 +97,8 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
|
||||||
{
|
{
|
||||||
if (contentTypes.Count == 0)
|
if (contentTypes.Count == 0)
|
||||||
{
|
{
|
||||||
|
_logger.SelectingOutputFormatterUsingAcceptHeader(acceptableMediaTypes);
|
||||||
|
|
||||||
// Use whatever formatter can meet the client's request
|
// Use whatever formatter can meet the client's request
|
||||||
selectedFormatter = SelectFormatterUsingSortedAcceptHeaders(
|
selectedFormatter = SelectFormatterUsingSortedAcceptHeaders(
|
||||||
context,
|
context,
|
||||||
|
|
@ -103,6 +107,8 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
_logger.SelectingOutputFormatterUsingAcceptHeaderAndExplicitContentTypes(acceptableMediaTypes, contentTypes);
|
||||||
|
|
||||||
// Verify that a content type from the context is compatible with the client's request
|
// Verify that a content type from the context is compatible with the client's request
|
||||||
selectedFormatter = SelectFormatterUsingSortedAcceptHeadersAndContentTypes(
|
selectedFormatter = SelectFormatterUsingSortedAcceptHeadersAndContentTypes(
|
||||||
context,
|
context,
|
||||||
|
|
@ -111,11 +117,14 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
|
||||||
contentTypes);
|
contentTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selectedFormatter == null && !_returnHttpNotAcceptable)
|
if (selectedFormatter == null)
|
||||||
{
|
{
|
||||||
_logger.NoFormatterFromNegotiation(acceptableMediaTypes);
|
_logger.NoFormatterFromNegotiation(acceptableMediaTypes);
|
||||||
|
|
||||||
selectFormatterWithoutRegardingAcceptHeader = true;
|
if (!_returnHttpNotAcceptable)
|
||||||
|
{
|
||||||
|
selectFormatterWithoutRegardingAcceptHeader = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -123,12 +132,16 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
|
||||||
{
|
{
|
||||||
if (contentTypes.Count == 0)
|
if (contentTypes.Count == 0)
|
||||||
{
|
{
|
||||||
|
_logger.SelectingOutputFormatterWithoutUsingContentTypes();
|
||||||
|
|
||||||
selectedFormatter = SelectFormatterNotUsingContentType(
|
selectedFormatter = SelectFormatterNotUsingContentType(
|
||||||
context,
|
context,
|
||||||
formatters);
|
formatters);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
_logger.SelectingOutputFormatterUsingContentTypes(contentTypes);
|
||||||
|
|
||||||
selectedFormatter = SelectFormatterUsingAnyAcceptableContentType(
|
selectedFormatter = SelectFormatterUsingAnyAcceptableContentType(
|
||||||
context,
|
context,
|
||||||
formatters,
|
formatters,
|
||||||
|
|
@ -180,6 +193,8 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
|
||||||
throw new ArgumentNullException(nameof(formatters));
|
throw new ArgumentNullException(nameof(formatters));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_logger.SelectFirstCanWriteFormatter();
|
||||||
|
|
||||||
foreach (var formatter in formatters)
|
foreach (var formatter in formatters)
|
||||||
{
|
{
|
||||||
formatterContext.ContentType = new StringSegment();
|
formatterContext.ContentType = new StringSegment();
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,13 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
private static readonly Action<ILogger, string, MediaTypeCollection, Exception> _actionDoesNotSupportFormatFilterContentType;
|
private static readonly Action<ILogger, string, MediaTypeCollection, Exception> _actionDoesNotSupportFormatFilterContentType;
|
||||||
private static readonly Action<ILogger, string, Exception> _cannotApplyFormatFilterContentType;
|
private static readonly Action<ILogger, string, Exception> _cannotApplyFormatFilterContentType;
|
||||||
private static readonly Action<ILogger, Exception> _actionDoesNotExplicitlySpecifyContentTypes;
|
private static readonly Action<ILogger, Exception> _actionDoesNotExplicitlySpecifyContentTypes;
|
||||||
|
private static readonly Action<ILogger, IEnumerable<MediaTypeSegmentWithQuality>, Exception> _selectingOutputFormatterUsingAcceptHeader;
|
||||||
|
private static readonly Action<ILogger, IEnumerable<MediaTypeSegmentWithQuality>, MediaTypeCollection, Exception> _selectingOutputFormatterUsingAcceptHeaderAndExplicitContentTypes;
|
||||||
|
private static readonly Action<ILogger, Exception> _selectingOutputFormatterWithoutUsingContentTypes;
|
||||||
|
private static readonly Action<ILogger, MediaTypeCollection, Exception> _selectingOutputFormatterUsingContentTypes;
|
||||||
|
private static readonly Action<ILogger, Exception> _selectingFirstCanWriteFormatter;
|
||||||
private static readonly Action<ILogger, Type, Type, Type, Exception> _notMostEffectiveFilter;
|
private static readonly Action<ILogger, Type, Type, Type, Exception> _notMostEffectiveFilter;
|
||||||
|
private static readonly Action<ILogger, IEnumerable<IOutputFormatter>, Exception> _registeredOutputFormatters;
|
||||||
|
|
||||||
static MvcCoreLoggerExtensions()
|
static MvcCoreLoggerExtensions()
|
||||||
{
|
{
|
||||||
|
|
@ -368,6 +374,69 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
LogLevel.Debug,
|
LogLevel.Debug,
|
||||||
5,
|
5,
|
||||||
"Current action does not explicitly specify any content types for the response.");
|
"Current action does not explicitly specify any content types for the response.");
|
||||||
|
|
||||||
|
_selectingOutputFormatterUsingAcceptHeader = LoggerMessage.Define<IEnumerable<MediaTypeSegmentWithQuality>>(
|
||||||
|
LogLevel.Debug,
|
||||||
|
6,
|
||||||
|
"Attempting to select an output formatter based on Accept header '{AcceptHeader}'.");
|
||||||
|
|
||||||
|
_selectingOutputFormatterUsingAcceptHeaderAndExplicitContentTypes = LoggerMessage.Define<IEnumerable<MediaTypeSegmentWithQuality>, MediaTypeCollection>(
|
||||||
|
LogLevel.Debug,
|
||||||
|
7,
|
||||||
|
"Attempting to select an output formatter based on Accept header '{AcceptHeader}' and explicitly specified content types '{ExplicitContentTypes}'. The content types in the accept header must be a subset of the explicitly set content types.");
|
||||||
|
|
||||||
|
_selectingOutputFormatterWithoutUsingContentTypes = LoggerMessage.Define(
|
||||||
|
LogLevel.Debug,
|
||||||
|
8,
|
||||||
|
"Attempting to select an output formatter without using a content type as no explicit content types were specified for the response.");
|
||||||
|
|
||||||
|
_selectingOutputFormatterUsingContentTypes = LoggerMessage.Define<MediaTypeCollection>(
|
||||||
|
LogLevel.Debug,
|
||||||
|
9,
|
||||||
|
"Attempting to select the first output formatter in the output formatters list which supports a content type from the explicitly specified content types '{ExplicitContentTypes}'.");
|
||||||
|
|
||||||
|
_selectingFirstCanWriteFormatter = LoggerMessage.Define(
|
||||||
|
LogLevel.Debug,
|
||||||
|
10,
|
||||||
|
"Attempting to select the first formatter in the output formatters list which can write the result.");
|
||||||
|
|
||||||
|
_registeredOutputFormatters = LoggerMessage.Define<IEnumerable<IOutputFormatter>>(
|
||||||
|
LogLevel.Debug,
|
||||||
|
11,
|
||||||
|
"List of registered output formatters, in the following order: {OutputFormatters}");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RegisteredOutputFormatters(this ILogger logger, IEnumerable<IOutputFormatter> outputFormatters)
|
||||||
|
{
|
||||||
|
_registeredOutputFormatters(logger, outputFormatters, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SelectingOutputFormatterUsingAcceptHeaderAndExplicitContentTypes(
|
||||||
|
this ILogger logger,
|
||||||
|
IEnumerable<MediaTypeSegmentWithQuality> acceptHeader,
|
||||||
|
MediaTypeCollection mediaTypeCollection)
|
||||||
|
{
|
||||||
|
_selectingOutputFormatterUsingAcceptHeaderAndExplicitContentTypes(logger, acceptHeader, mediaTypeCollection, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SelectingOutputFormatterUsingAcceptHeader(this ILogger logger, IEnumerable<MediaTypeSegmentWithQuality> acceptHeader)
|
||||||
|
{
|
||||||
|
_selectingOutputFormatterUsingAcceptHeader(logger, acceptHeader, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SelectingOutputFormatterUsingContentTypes(this ILogger logger, MediaTypeCollection mediaTypeCollection)
|
||||||
|
{
|
||||||
|
_selectingOutputFormatterUsingContentTypes(logger, mediaTypeCollection, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SelectingOutputFormatterWithoutUsingContentTypes(this ILogger logger)
|
||||||
|
{
|
||||||
|
_selectingOutputFormatterWithoutUsingContentTypes(logger, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SelectFirstCanWriteFormatter(this ILogger logger)
|
||||||
|
{
|
||||||
|
_selectingFirstCanWriteFormatter(logger, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IDisposable ActionScope(this ILogger logger, ActionDescriptor action)
|
public static IDisposable ActionScope(this ILogger logger, ActionDescriptor action)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue