Add logging to ActionResults and ControllerActionInvoker

This commit is contained in:
ryanbrandenburg 2015-10-20 12:51:11 -07:00 committed by Ryan Nowak
parent 5bb9759166
commit da731fc641
51 changed files with 908 additions and 79 deletions

View File

@ -5,6 +5,9 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Authentication;
using Microsoft.AspNet.Mvc.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
{ {
@ -52,18 +55,23 @@ namespace Microsoft.AspNet.Mvc
throw new ArgumentNullException(nameof(context)); throw new ArgumentNullException(nameof(context));
} }
var auth = context.HttpContext.Authentication; var loggerFactory = context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger<ChallengeResult>();
var authentication = context.HttpContext.Authentication;
if (AuthenticationSchemes.Count > 0) if (AuthenticationSchemes.Count > 0)
{ {
foreach (var scheme in AuthenticationSchemes) foreach (var scheme in AuthenticationSchemes)
{ {
await auth.ChallengeAsync(scheme, Properties); await authentication.ChallengeAsync(scheme, Properties);
} }
} }
else else
{ {
await auth.ChallengeAsync(Properties); await authentication.ChallengeAsync(Properties);
} }
logger.ChallengeResultExecuting(AuthenticationSchemes);
} }
} }
} }

View File

@ -7,6 +7,9 @@ using System.Threading.Tasks;
using Microsoft.AspNet.Http; using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features;
using Microsoft.AspNet.Mvc.Internal; using Microsoft.AspNet.Mvc.Internal;
using Microsoft.AspNet.Mvc.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
@ -40,6 +43,9 @@ namespace Microsoft.AspNet.Mvc
throw new ArgumentNullException(nameof(context)); throw new ArgumentNullException(nameof(context));
} }
var loggerFactory = context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger<ContentResult>();
var response = context.HttpContext.Response; var response = context.HttpContext.Response;
var contentTypeHeader = ContentType; var contentTypeHeader = ContentType;
@ -59,6 +65,8 @@ namespace Microsoft.AspNet.Mvc
response.StatusCode = StatusCode.Value; response.StatusCode = StatusCode.Value;
} }
logger.ContentResultExecuting(contentTypeHeader);
if (Content != null) if (Content != null)
{ {
var bufferingFeature = response.HttpContext.Features.Get<IHttpBufferingFeature>(); var bufferingFeature = response.HttpContext.Features.Get<IHttpBufferingFeature>();

View File

@ -103,7 +103,7 @@ namespace Microsoft.AspNet.Mvc.Controllers
} }
} }
private static object[] PrepareArguments( public static object[] PrepareArguments(
IDictionary<string, object> actionParameters, IDictionary<string, object> actionParameters,
ParameterInfo[] declaredParameterInfos) ParameterInfo[] declaredParameterInfos)
{ {

View File

@ -10,6 +10,7 @@ using Microsoft.AspNet.Mvc.Core;
using Microsoft.AspNet.Mvc.Filters; using Microsoft.AspNet.Mvc.Filters;
using Microsoft.AspNet.Mvc.Formatters; using Microsoft.AspNet.Mvc.Formatters;
using Microsoft.AspNet.Mvc.Infrastructure; using Microsoft.AspNet.Mvc.Infrastructure;
using Microsoft.AspNet.Mvc.Logging;
using Microsoft.AspNet.Mvc.ModelBinding; using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.Mvc.ModelBinding.Validation; using Microsoft.AspNet.Mvc.ModelBinding.Validation;
using Microsoft.Extensions.Internal; using Microsoft.Extensions.Internal;
@ -144,14 +145,23 @@ namespace Microsoft.AspNet.Mvc.Controllers
protected override async Task<IActionResult> InvokeActionAsync(ActionExecutingContext actionExecutingContext) protected override async Task<IActionResult> InvokeActionAsync(ActionExecutingContext actionExecutingContext)
{ {
var actionMethodInfo = _descriptor.MethodInfo; var actionMethodInfo = _descriptor.MethodInfo;
var arguments = ControllerActionExecutor.PrepareArguments(
actionExecutingContext.ActionArguments,
actionMethodInfo.GetParameters());
Logger.ActionMethodExecuting(actionExecutingContext, arguments);
var actionReturnValue = await ControllerActionExecutor.ExecuteAsync( var actionReturnValue = await ControllerActionExecutor.ExecuteAsync(
actionMethodInfo, actionMethodInfo,
actionExecutingContext.Controller, actionExecutingContext.Controller,
actionExecutingContext.ActionArguments); arguments);
var actionResult = CreateActionResult( var actionResult = CreateActionResult(
actionMethodInfo.ReturnType, actionMethodInfo.ReturnType,
actionReturnValue); actionReturnValue);
Logger.ActionMethodExecuted(actionExecutingContext, actionResult);
return actionResult; return actionResult;
} }

View File

@ -29,7 +29,6 @@ namespace Microsoft.AspNet.Mvc.Controllers
private readonly IReadOnlyList<IModelValidatorProvider> _modelValidatorProviders; private readonly IReadOnlyList<IModelValidatorProvider> _modelValidatorProviders;
private readonly IReadOnlyList<IValueProviderFactory> _valueProviderFactories; private readonly IReadOnlyList<IValueProviderFactory> _valueProviderFactories;
private readonly IActionBindingContextAccessor _actionBindingContextAccessor; private readonly IActionBindingContextAccessor _actionBindingContextAccessor;
private readonly ILogger _logger;
private readonly DiagnosticSource _diagnosticSource; private readonly DiagnosticSource _diagnosticSource;
private readonly int _maxModelValidationErrors; private readonly int _maxModelValidationErrors;
@ -132,7 +131,7 @@ namespace Microsoft.AspNet.Mvc.Controllers
_modelValidatorProviders = modelValidatorProviders; _modelValidatorProviders = modelValidatorProviders;
_valueProviderFactories = valueProviderFactories; _valueProviderFactories = valueProviderFactories;
_actionBindingContextAccessor = actionBindingContextAccessor; _actionBindingContextAccessor = actionBindingContextAccessor;
_logger = logger; Logger = logger;
_diagnosticSource = diagnosticSource; _diagnosticSource = diagnosticSource;
_maxModelValidationErrors = maxModelValidationErrors; _maxModelValidationErrors = maxModelValidationErrors;
} }
@ -153,6 +152,8 @@ namespace Microsoft.AspNet.Mvc.Controllers
protected object Instance { get; private set; } protected object Instance { get; private set; }
protected ILogger Logger { get; }
/// <summary> /// <summary>
/// Called to create an instance of an object which will act as the reciever of the action invocation. /// Called to create an instance of an object which will act as the reciever of the action invocation.
/// </summary> /// </summary>
@ -296,7 +297,7 @@ namespace Microsoft.AspNet.Mvc.Controllers
} }
else else
{ {
_logger.LogWarning(AuthorizationFailureLogMessage, current.FilterAsync.GetType().FullName); Logger.LogWarning(AuthorizationFailureLogMessage, current.FilterAsync.GetType().FullName);
} }
} }
else if (current.Filter != null) else if (current.Filter != null)
@ -310,7 +311,7 @@ namespace Microsoft.AspNet.Mvc.Controllers
} }
else else
{ {
_logger.LogWarning(AuthorizationFailureLogMessage, current.Filter.GetType().FullName); Logger.LogWarning(AuthorizationFailureLogMessage, current.Filter.GetType().FullName);
} }
} }
else else
@ -366,7 +367,7 @@ namespace Microsoft.AspNet.Mvc.Controllers
// If we get here then the filter didn't call 'next' indicating a short circuit // If we get here then the filter didn't call 'next' indicating a short circuit
if (_resourceExecutingContext.Result != null) if (_resourceExecutingContext.Result != null)
{ {
_logger.LogVerbose( Logger.LogVerbose(
ResourceFilterShortCircuitLogMessage, ResourceFilterShortCircuitLogMessage,
item.FilterAsync.GetType().FullName); item.FilterAsync.GetType().FullName);
@ -387,8 +388,7 @@ namespace Microsoft.AspNet.Mvc.Controllers
if (_resourceExecutingContext.Result != null) if (_resourceExecutingContext.Result != null)
{ {
// Short-circuited by setting a result. // Short-circuited by setting a result.
Logger.LogVerbose(ResourceFilterShortCircuitLogMessage, item.Filter.GetType().FullName);
_logger.LogVerbose(ResourceFilterShortCircuitLogMessage, item.Filter.GetType().FullName);
await InvokeResultAsync(_resourceExecutingContext.Result); await InvokeResultAsync(_resourceExecutingContext.Result);
@ -506,7 +506,7 @@ namespace Microsoft.AspNet.Mvc.Controllers
if (_exceptionContext.Exception == null) if (_exceptionContext.Exception == null)
{ {
_logger.LogVerbose( Logger.LogVerbose(
ExceptionFilterShortCircuitLogMessage, ExceptionFilterShortCircuitLogMessage,
current.FilterAsync.GetType().FullName); current.FilterAsync.GetType().FullName);
} }
@ -527,7 +527,7 @@ namespace Microsoft.AspNet.Mvc.Controllers
if (_exceptionContext.Exception == null) if (_exceptionContext.Exception == null)
{ {
_logger.LogVerbose( Logger.LogVerbose(
ExceptionFilterShortCircuitLogMessage, ExceptionFilterShortCircuitLogMessage,
current.Filter.GetType().FullName); current.Filter.GetType().FullName);
} }
@ -608,7 +608,7 @@ namespace Microsoft.AspNet.Mvc.Controllers
{ {
// If we get here then the filter didn't call 'next' indicating a short circuit // If we get here then the filter didn't call 'next' indicating a short circuit
_logger.LogVerbose(ActionFilterShortCircuitLogMessage, item.FilterAsync.GetType().FullName); Logger.LogVerbose(ActionFilterShortCircuitLogMessage, item.FilterAsync.GetType().FullName);
_actionExecutedContext = new ActionExecutedContext( _actionExecutedContext = new ActionExecutedContext(
_actionExecutingContext, _actionExecutingContext,
@ -628,7 +628,7 @@ namespace Microsoft.AspNet.Mvc.Controllers
{ {
// Short-circuited by setting a result. // Short-circuited by setting a result.
_logger.LogVerbose(ActionFilterShortCircuitLogMessage, item.Filter.GetType().FullName); Logger.LogVerbose(ActionFilterShortCircuitLogMessage, item.Filter.GetType().FullName);
_actionExecutedContext = new ActionExecutedContext( _actionExecutedContext = new ActionExecutedContext(
_actionExecutingContext, _actionExecutingContext,
@ -752,8 +752,7 @@ namespace Microsoft.AspNet.Mvc.Controllers
if (_resultExecutedContext == null || _resultExecutingContext.Cancel == true) if (_resultExecutedContext == null || _resultExecutingContext.Cancel == true)
{ {
// Short-circuited by not calling next || Short-circuited by setting Cancel == true // Short-circuited by not calling next || Short-circuited by setting Cancel == true
Logger.LogVerbose(ResourceFilterShortCircuitLogMessage, item.FilterAsync.GetType().FullName);
_logger.LogVerbose(ResourceFilterShortCircuitLogMessage, item.FilterAsync.GetType().FullName);
_resultExecutedContext = new ResultExecutedContext( _resultExecutedContext = new ResultExecutedContext(
_resultExecutingContext, _resultExecutingContext,
@ -772,8 +771,7 @@ namespace Microsoft.AspNet.Mvc.Controllers
if (_resultExecutingContext.Cancel == true) if (_resultExecutingContext.Cancel == true)
{ {
// Short-circuited by setting Cancel == true // Short-circuited by setting Cancel == true
Logger.LogVerbose(ResourceFilterShortCircuitLogMessage, item.Filter.GetType().FullName);
_logger.LogVerbose(ResourceFilterShortCircuitLogMessage, item.Filter.GetType().FullName);
_resultExecutedContext = new ResultExecutedContext( _resultExecutedContext = new ResultExecutedContext(
_resultExecutingContext, _resultExecutingContext,

View File

@ -4,6 +4,9 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.Http; using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
@ -67,6 +70,9 @@ namespace Microsoft.AspNet.Mvc
throw new ArgumentNullException(nameof(context)); throw new ArgumentNullException(nameof(context));
} }
var loggerFactory = context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory?.CreateLogger<FileResult>();
var response = context.HttpContext.Response; var response = context.HttpContext.Response;
response.ContentType = ContentType.ToString(); response.ContentType = ContentType.ToString();
@ -77,11 +83,12 @@ namespace Microsoft.AspNet.Mvc
// detached and stored in a separate file. If the receiving MUA writes // detached and stored in a separate file. If the receiving MUA writes
// the entity to a file, the suggested filename should be used as a // the entity to a file, the suggested filename should be used as a
// basis for the actual filename, where possible. // basis for the actual filename, where possible.
var cd = new ContentDispositionHeaderValue("attachment"); var contentDisposition = new ContentDispositionHeaderValue("attachment");
cd.SetHttpFileName(FileDownloadName); contentDisposition.SetHttpFileName(FileDownloadName);
context.HttpContext.Response.Headers[HeaderNames.ContentDisposition] = cd.ToString(); context.HttpContext.Response.Headers[HeaderNames.ContentDisposition] = contentDisposition.ToString();
} }
logger.FileResultExecuting(FileDownloadName);
return WriteFileAsync(response); return WriteFileAsync(response);
} }

View File

@ -2,6 +2,9 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using Microsoft.AspNet.Mvc.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
{ {
@ -34,6 +37,11 @@ namespace Microsoft.AspNet.Mvc
throw new ArgumentNullException(nameof(context)); throw new ArgumentNullException(nameof(context));
} }
var factory = context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = factory.CreateLogger<HttpStatusCodeResult>();
logger.HttpStatusCodeResultExecuting(StatusCode);
context.HttpContext.Response.StatusCode = StatusCode; context.HttpContext.Response.StatusCode = StatusCode;
} }
} }

View File

@ -9,6 +9,7 @@ using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc.Core; using Microsoft.AspNet.Mvc.Core;
using Microsoft.AspNet.Mvc.Formatters; using Microsoft.AspNet.Mvc.Formatters;
using Microsoft.AspNet.Mvc.Internal; using Microsoft.AspNet.Mvc.Internal;
using Microsoft.AspNet.Mvc.Logging;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.OptionsModel; using Microsoft.Extensions.OptionsModel;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
@ -126,6 +127,8 @@ namespace Microsoft.AspNet.Mvc.Infrastructure
selectedFormatter.GetType().FullName, selectedFormatter.GetType().FullName,
formatterContext.ContentType); formatterContext.ContentType);
Logger.ObjectResultExecuting(context);
result.OnFormatting(context); result.OnFormatting(context);
return selectedFormatter.WriteAsync(formatterContext); return selectedFormatter.WriteAsync(formatterContext);
} }

View File

@ -0,0 +1,28 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc.Logging
{
public static class ChallengeResultLoggerExtenstions
{
private static Action<ILogger, string[], Exception> _challengeResultExecuting;
static ChallengeResultLoggerExtenstions()
{
_challengeResultExecuting = LoggerMessage.Define<string[]>(
LogLevel.Information,
1,
"Executing ChallengeResult with authentication schemes ({Schemes}).");
}
public static void ChallengeResultExecuting(this ILogger logger, IList<string> schemes)
{
_challengeResultExecuting(logger, schemes.ToArray(), null);
}
}
}

View File

@ -0,0 +1,27 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.Extensions.Logging;
using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNet.Mvc.Logging
{
public static class ContentResultLoggerExtensions
{
private static Action<ILogger, string, Exception> _contentResultExecuting;
static ContentResultLoggerExtensions()
{
_contentResultExecuting = LoggerMessage.Define<string>(
LogLevel.Information,
1,
"Executing ContentResult with HTTP Response ContentType of {ContentType}");
}
public static void ContentResultExecuting(this ILogger logger, MediaTypeHeaderValue contentType)
{
_contentResultExecuting(logger, contentType?.MediaType, null);
}
}
}

View File

@ -0,0 +1,61 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNet.Mvc.Filters;
using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc.Logging
{
public static class ControllerActionInvokerLoggerExtensions
{
private static Action<ILogger, string, string[], ModelValidationState, Exception> _actionMethodExecuting;
private static Action<ILogger, string, string, Exception> _actionMethodExecuted;
static ControllerActionInvokerLoggerExtensions()
{
_actionMethodExecuting = LoggerMessage.Define<string, string[], ModelValidationState>(
LogLevel.Information,
1,
"Executing action method {ActionName} with arguments ({Arguments}) - ModelState is {ValidationState}'");
_actionMethodExecuted = LoggerMessage.Define<string, string>(
LogLevel.Information,
2,
"Executed action method {ActionName}, returned result {ActionResult}.'");
}
public static void ActionMethodExecuting(this ILogger logger, ActionExecutingContext context, object[] arguments)
{
if (logger.IsEnabled(LogLevel.Information))
{
var actionName = context.ActionDescriptor.DisplayName;
string[] convertedArguments;
if (arguments == null)
{
convertedArguments = null;
}
else
{
convertedArguments = new string[arguments.Length];
for (var i = 0; i < arguments.Length; i++)
{
convertedArguments[i] = Convert.ToString(arguments[i]);
}
}
var validationState = context.ModelState.ValidationState;
_actionMethodExecuting(logger, actionName, convertedArguments, validationState, null);
}
}
public static void ActionMethodExecuted(this ILogger logger, ActionExecutingContext context, IActionResult result)
{
var actionName = context.ActionDescriptor.DisplayName;
_actionMethodExecuted(logger, actionName, Convert.ToString(result), null);
}
}
}

View File

@ -0,0 +1,26 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc.Logging
{
public static class FileResultLoggerExtensions
{
private static Action<ILogger, string, Exception> _fileResultExecuting;
static FileResultLoggerExtensions()
{
_fileResultExecuting = LoggerMessage.Define<string>(
LogLevel.Information,
1,
"Executing FileResult, sending file as {FileDownloadName}");
}
public static void FileResultExecuting(this ILogger logger, string fileDownloadName)
{
_fileResultExecuting(logger, fileDownloadName, null);
}
}
}

View File

@ -0,0 +1,26 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc.Logging
{
public static class HttpStatusCodeLoggerExtensions
{
private static Action<ILogger, int, Exception> _httpStatusCodeResultExecuting;
static HttpStatusCodeLoggerExtensions()
{
_httpStatusCodeResultExecuting = LoggerMessage.Define<int>(
LogLevel.Information,
1,
"Executing HttpStatusCodeResult, setting HTTP status code {StatusCode}");
}
public static void HttpStatusCodeResultExecuting(this ILogger logger, int statusCode)
{
_httpStatusCodeResultExecuting(logger, statusCode, null);
}
}
}

View File

@ -0,0 +1,26 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc.Logging
{
public static class JsonResultLoggerExtensions
{
private static Action<ILogger, string, Exception> _jsonResultExecuting;
static JsonResultLoggerExtensions()
{
_jsonResultExecuting = LoggerMessage.Define<string>(
LogLevel.Information,
1,
"Executing JsonResult, writing value {Value}.");
}
public static void JsonResultExecuting(this ILogger logger, object value)
{
_jsonResultExecuting(logger, Convert.ToString(value), null);
}
}
}

View File

@ -0,0 +1,26 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc.Logging
{
public static class ObjectResultExecutorLoggerExtensions
{
private static Action<ILogger, string, Exception> _objectResultExecuting;
static ObjectResultExecutorLoggerExtensions()
{
_objectResultExecuting = LoggerMessage.Define<string>(
LogLevel.Information,
1,
"Executing ObjectResult, writing value {Value}.");
}
public static void ObjectResultExecuting(this ILogger logger, object value)
{
_objectResultExecuting(logger, Convert.ToString(value), null);
}
}
}

View File

@ -0,0 +1,26 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc.Logging
{
public static class RedirectResultLoggerExtensions
{
private static Action<ILogger, string, Exception> _redirectResultExecuting;
static RedirectResultLoggerExtensions()
{
_redirectResultExecuting = LoggerMessage.Define<string>(
LogLevel.Information,
1,
"Executing RedirectResult, redirecting to {Destination}.");
}
public static void RedirectResultExecuting(this ILogger logger, string destination)
{
_redirectResultExecuting(logger, destination, null);
}
}
}

View File

@ -0,0 +1,26 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc.Logging
{
public static class RedirectToActionResultLoggerExtensions
{
private static Action<ILogger, string, Exception> _redirectToActionResultExecuting;
static RedirectToActionResultLoggerExtensions()
{
_redirectToActionResultExecuting = LoggerMessage.Define<string>(
LogLevel.Information,
1,
"Executing RedirectResult, redirecting to {Destination}.");
}
public static void RedirectToActionResultExecuting(this ILogger logger, string destination)
{
_redirectToActionResultExecuting(logger, destination, null);
}
}
}

View File

@ -0,0 +1,26 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc.Logging
{
public static class RedirectToRouteResultLoggerExtensions
{
private static Action<ILogger, string, string, Exception> _redirectToRouteResultExecuting;
static RedirectToRouteResultLoggerExtensions()
{
_redirectToRouteResultExecuting = LoggerMessage.Define<string, string>(
LogLevel.Information,
1,
"Executing RedirectToRouteResult, redirecting to {Destination} from route {RouteName}.");
}
public static void RedirectToRouteResultExecuting(this ILogger logger, string destination, string routeName)
{
_redirectToRouteResultExecuting(logger, destination, routeName, null);
}
}
}

View File

@ -36,7 +36,9 @@ namespace Microsoft.AspNet.Mvc
public override Task ExecuteResultAsync(ActionContext context) public override Task ExecuteResultAsync(ActionContext context)
{ {
var executor = context.HttpContext.RequestServices.GetRequiredService<ObjectResultExecutor>(); var executor = context.HttpContext.RequestServices.GetRequiredService<ObjectResultExecutor>();
return executor.ExecuteAsync(context, this); var result = executor.ExecuteAsync(context, this);
return result;
} }
/// <summary> /// <summary>

View File

@ -3,8 +3,10 @@
using System; using System;
using Microsoft.AspNet.Mvc.Core; using Microsoft.AspNet.Mvc.Core;
using Microsoft.AspNet.Mvc.Logging;
using Microsoft.AspNet.Mvc.ViewFeatures; using Microsoft.AspNet.Mvc.ViewFeatures;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
{ {
@ -65,6 +67,9 @@ namespace Microsoft.AspNet.Mvc
throw new ArgumentNullException(nameof(context)); throw new ArgumentNullException(nameof(context));
} }
var loggerFactory = context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger<RedirectResult>();
var urlHelper = GetUrlHelper(context); var urlHelper = GetUrlHelper(context);
// IsLocalUrl is called to handle Urls starting with '~/'. // IsLocalUrl is called to handle Urls starting with '~/'.
@ -74,6 +79,7 @@ namespace Microsoft.AspNet.Mvc
destinationUrl = urlHelper.Content(Url); destinationUrl = urlHelper.Content(Url);
} }
logger.RedirectResultExecuting(destinationUrl);
context.HttpContext.Response.Redirect(destinationUrl, Permanent); context.HttpContext.Response.Redirect(destinationUrl, Permanent);
} }

View File

@ -4,8 +4,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNet.Mvc.Core; using Microsoft.AspNet.Mvc.Core;
using Microsoft.AspNet.Mvc.Logging;
using Microsoft.AspNet.Mvc.ViewFeatures; using Microsoft.AspNet.Mvc.ViewFeatures;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
{ {
@ -48,6 +50,9 @@ namespace Microsoft.AspNet.Mvc
throw new ArgumentNullException(nameof(context)); throw new ArgumentNullException(nameof(context));
} }
var loggerFactory = context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger<RedirectToActionResult>();
var urlHelper = GetUrlHelper(context); var urlHelper = GetUrlHelper(context);
var destinationUrl = urlHelper.Action(ActionName, ControllerName, RouteValues); var destinationUrl = urlHelper.Action(ActionName, ControllerName, RouteValues);
@ -56,6 +61,7 @@ namespace Microsoft.AspNet.Mvc
throw new InvalidOperationException(Resources.NoRoutesMatched); throw new InvalidOperationException(Resources.NoRoutesMatched);
} }
logger.RedirectToActionResultExecuting(destinationUrl);
context.HttpContext.Response.Redirect(destinationUrl, Permanent); context.HttpContext.Response.Redirect(destinationUrl, Permanent);
} }

View File

@ -4,9 +4,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNet.Mvc.Core; using Microsoft.AspNet.Mvc.Core;
using Microsoft.AspNet.Mvc.Logging;
using Microsoft.AspNet.Mvc.ViewFeatures; using Microsoft.AspNet.Mvc.ViewFeatures;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Internal; using Microsoft.Extensions.Internal;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
{ {
@ -49,6 +51,9 @@ namespace Microsoft.AspNet.Mvc
throw new ArgumentNullException(nameof(context)); throw new ArgumentNullException(nameof(context));
} }
var loggerFactory = context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger<RedirectToRouteResult>();
var urlHelper = GetUrlHelper(context); var urlHelper = GetUrlHelper(context);
var destinationUrl = urlHelper.RouteUrl(RouteName, RouteValues); var destinationUrl = urlHelper.RouteUrl(RouteName, RouteValues);
@ -57,6 +62,7 @@ namespace Microsoft.AspNet.Mvc
throw new InvalidOperationException(Resources.NoRoutesMatched); throw new InvalidOperationException(Resources.NoRoutesMatched);
} }
logger.RedirectToRouteResultExecuting(destinationUrl, RouteName);
context.HttpContext.Response.Redirect(destinationUrl, Permanent); context.HttpContext.Response.Redirect(destinationUrl, Permanent);
} }

View File

@ -5,9 +5,11 @@ using System;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.OptionsModel; using Microsoft.Extensions.OptionsModel;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using Newtonsoft.Json; using Newtonsoft.Json;
using Microsoft.AspNet.Mvc.Logging;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
{ {
@ -72,6 +74,9 @@ namespace Microsoft.AspNet.Mvc
throw new ArgumentNullException(nameof(context)); throw new ArgumentNullException(nameof(context));
} }
var loggerFactory = context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger<JsonResult>();
var response = context.HttpContext.Response; var response = context.HttpContext.Response;
var contentTypeHeader = ContentType; var contentTypeHeader = ContentType;
@ -107,6 +112,8 @@ namespace Microsoft.AspNet.Mvc
.SerializerSettings; .SerializerSettings;
} }
logger.JsonResultExecuting(Value);
using (var writer = new HttpResponseStreamWriter(response.Body, contentTypeHeader.Encoding)) using (var writer = new HttpResponseStreamWriter(response.Body, contentTypeHeader.Encoding))
{ {
using (var jsonWriter = new JsonTextWriter(writer)) using (var jsonWriter = new JsonTextWriter(writer))

View File

@ -0,0 +1,27 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNet.Mvc.ViewEngines;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc.Logging
{
public static class PartialViewResultExecutorLoggerExtensions
{
private static Action<ILogger, string, Exception> _partialViewResultExecuting;
static PartialViewResultExecutorLoggerExtensions()
{
_partialViewResultExecuting = LoggerMessage.Define<string>(
LogLevel.Information,
1,
"Executing PartialViewResult, running view at path {Path}.");
}
public static void PartialViewResultExecuting(this ILogger logger, IView view)
{
_partialViewResultExecuting(logger, view.Path, null);
}
}
}

View File

@ -0,0 +1,49 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc.Logging
{
public static class ViewComponentResultLoggerExtensions
{
private static Action<ILogger, string, string[], Exception> _viewComponentResultExecuting;
static ViewComponentResultLoggerExtensions()
{
_viewComponentResultExecuting = LoggerMessage.Define<string, string[]>(
LogLevel.Information,
1,
"Executing ViewComponentResult, running {ViewComponentName} with arguments ({Arguments}).");
}
public static void ViewComponentResultExecuting(this ILogger logger, string viewComponentName, object[] arguments)
{
if (logger.IsEnabled(LogLevel.Information))
{
var formattedArguments = new string[arguments.Length];
for (var i = 0; i < arguments.Length; i++)
{
formattedArguments[i] = Convert.ToString(arguments[i]);
}
_viewComponentResultExecuting(logger, viewComponentName, formattedArguments, null);
}
}
public static void ViewComponentResultExecuting(this ILogger logger, Type viewComponentType, object[] arguments)
{
if (logger.IsEnabled(LogLevel.Information))
{
var formattedArguments = new string[arguments.Length];
for (var i = 0; i < arguments.Length; i++)
{
formattedArguments[i] = Convert.ToString(arguments[i]);
}
_viewComponentResultExecuting(logger, viewComponentType.Name, formattedArguments, null);
}
}
}
}

View File

@ -0,0 +1,27 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNet.Mvc.ViewEngines;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNet.Mvc.Logging
{
public static class ViewResultExecutorLoggerExtensions
{
private static Action<ILogger, string, Exception> _viewResultExecuting;
static ViewResultExecutorLoggerExtensions()
{
_viewResultExecuting = LoggerMessage.Define<string>(
LogLevel.Information,
1,
"Executing ViewResult, running view at path {Path}.");
}
public static void ViewResultExecuting(this ILogger logger, IView view)
{
_viewResultExecuting(logger, view.Path, null);
}
}
}

View File

@ -4,12 +4,14 @@
using System; using System;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.Mvc.Logging;
using Microsoft.AspNet.Mvc.ModelBinding; using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Mvc.ViewEngines; using Microsoft.AspNet.Mvc.ViewEngines;
using Microsoft.AspNet.Mvc.ViewFeatures; using Microsoft.AspNet.Mvc.ViewFeatures;
using Microsoft.AspNet.Mvc.ViewFeatures.Internal; using Microsoft.AspNet.Mvc.ViewFeatures.Internal;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.OptionsModel; using Microsoft.Extensions.OptionsModel;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
@ -72,6 +74,9 @@ namespace Microsoft.AspNet.Mvc
var htmlHelperOptions = services.GetRequiredService<IOptions<MvcViewOptions>>().Value.HtmlHelperOptions; var htmlHelperOptions = services.GetRequiredService<IOptions<MvcViewOptions>>().Value.HtmlHelperOptions;
var viewComponentHelper = services.GetRequiredService<IViewComponentHelper>(); var viewComponentHelper = services.GetRequiredService<IViewComponentHelper>();
var loggerFactory = services.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger<ViewComponentResult>();
var viewData = ViewData; var viewData = ViewData;
if (viewData == null) if (viewData == null)
{ {
@ -124,10 +129,12 @@ namespace Microsoft.AspNet.Mvc
} }
else if (ViewComponentType == null) else if (ViewComponentType == null)
{ {
logger.ViewComponentResultExecuting(ViewComponentName, Arguments);
await viewComponentHelper.RenderInvokeAsync(ViewComponentName, Arguments); await viewComponentHelper.RenderInvokeAsync(ViewComponentName, Arguments);
} }
else else
{ {
logger.ViewComponentResultExecuting(ViewComponentType, Arguments);
await viewComponentHelper.RenderInvokeAsync(ViewComponentType, Arguments); await viewComponentHelper.RenderInvokeAsync(ViewComponentType, Arguments);
} }
} }

View File

@ -5,6 +5,7 @@ using System;
using System.Diagnostics; using System.Diagnostics;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.Mvc.Infrastructure; using Microsoft.AspNet.Mvc.Infrastructure;
using Microsoft.AspNet.Mvc.Logging;
using Microsoft.AspNet.Mvc.ViewEngines; using Microsoft.AspNet.Mvc.ViewEngines;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.OptionsModel; using Microsoft.Extensions.OptionsModel;
@ -134,6 +135,8 @@ namespace Microsoft.AspNet.Mvc.ViewFeatures
throw new ArgumentNullException(nameof(viewResult)); throw new ArgumentNullException(nameof(viewResult));
} }
Logger.PartialViewResultExecuting(view);
return ExecuteAsync( return ExecuteAsync(
actionContext, actionContext,
view, view,

View File

@ -5,6 +5,7 @@ using System;
using System.Diagnostics; using System.Diagnostics;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.Mvc.Infrastructure; using Microsoft.AspNet.Mvc.Infrastructure;
using Microsoft.AspNet.Mvc.Logging;
using Microsoft.AspNet.Mvc.ViewEngines; using Microsoft.AspNet.Mvc.ViewEngines;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.OptionsModel; using Microsoft.Extensions.OptionsModel;
@ -134,6 +135,9 @@ namespace Microsoft.AspNet.Mvc.ViewFeatures
throw new ArgumentNullException(nameof(viewResult)); throw new ArgumentNullException(nameof(viewResult));
} }
Logger.ViewResultExecuting(view);
return ExecuteAsync( return ExecuteAsync(
actionContext, actionContext,
view, view,

View File

@ -6,6 +6,9 @@ using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Authentication;
using Microsoft.AspNet.Mvc.Abstractions; using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Moq; using Moq;
using Xunit; using Xunit;
@ -18,7 +21,10 @@ namespace Microsoft.AspNet.Mvc
{ {
// Arrange // Arrange
var result = new ChallengeResult("", null); var result = new ChallengeResult("", null);
var httpContext = new Mock<HttpContext>(); var httpContext = new Mock<HttpContext>();
httpContext.SetupGet(c => c.RequestServices).Returns(CreateServices().BuildServiceProvider());
var auth = new Mock<AuthenticationManager>(); var auth = new Mock<AuthenticationManager>();
httpContext.Setup(o => o.Authentication).Returns(auth.Object); httpContext.Setup(o => o.Authentication).Returns(auth.Object);
@ -41,7 +47,10 @@ namespace Microsoft.AspNet.Mvc
{ {
// Arrange // Arrange
var result = new ChallengeResult(new string[] { }, null); var result = new ChallengeResult(new string[] { }, null);
var httpContext = new Mock<HttpContext>(); var httpContext = new Mock<HttpContext>();
httpContext.SetupGet(c => c.RequestServices).Returns(CreateServices().BuildServiceProvider());
var auth = new Mock<AuthenticationManager>(); var auth = new Mock<AuthenticationManager>();
httpContext.Setup(o => o.Authentication).Returns(auth.Object); httpContext.Setup(o => o.Authentication).Returns(auth.Object);
@ -58,5 +67,12 @@ namespace Microsoft.AspNet.Mvc
// Assert // Assert
auth.Verify(c => c.ChallengeAsync((AuthenticationProperties)null), Times.Exactly(1)); auth.Verify(c => c.ChallengeAsync((AuthenticationProperties)null), Times.Exactly(1));
} }
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
} }
} }

View File

@ -9,7 +9,11 @@ using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features;
using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Http.Internal;
using Microsoft.AspNet.Mvc.Abstractions; using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Mvc.ViewComponents;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using Moq; using Moq;
using Xunit; using Xunit;
@ -94,7 +98,7 @@ namespace Microsoft.AspNet.Mvc
Encoding = Encoding.ASCII Encoding = Encoding.ASCII
} }
}; };
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
httpContext.Features.Set<IHttpBufferingFeature>(new TestBufferingFeature()); httpContext.Features.Set<IHttpBufferingFeature>(new TestBufferingFeature());
var memoryStream = new MemoryStream(); var memoryStream = new MemoryStream();
httpContext.Response.Body = memoryStream; httpContext.Response.Body = memoryStream;
@ -215,9 +219,21 @@ namespace Microsoft.AspNet.Mvc
new ActionDescriptor()); new ActionDescriptor());
} }
private static IServiceCollection CreateServices(params ViewComponentDescriptor[] descriptors)
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
private static HttpContext GetHttpContext() private static HttpContext GetHttpContext()
{ {
return new DefaultHttpContext(); var services = CreateServices();
var httpContext = new DefaultHttpContext();
httpContext.RequestServices = services.BuildServiceProvider();
return httpContext;
} }
} }
} }

View File

@ -18,6 +18,7 @@ using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.Mvc.ModelBinding.Validation; using Microsoft.AspNet.Mvc.ModelBinding.Validation;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.AspNet.Testing; using Microsoft.AspNet.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing; using Microsoft.Extensions.Logging.Testing;
using Microsoft.Extensions.OptionsModel; using Microsoft.Extensions.OptionsModel;
@ -1976,13 +1977,17 @@ namespace Microsoft.AspNet.Mvc.Controllers
} }
var httpContext = new Mock<HttpContext>(MockBehavior.Loose); var httpContext = new Mock<HttpContext>(MockBehavior.Loose);
var httpRequest = new DefaultHttpContext().Request;
var httpResponse = new DefaultHttpContext().Response; var http = GetHttpContext();
var httpRequest = http.Request;
var httpResponse = http.Response;
httpContext.SetupGet(c => c.Request).Returns(httpRequest); httpContext.SetupGet(c => c.Request).Returns(httpRequest);
httpContext.SetupGet(c => c.Response).Returns(httpResponse); httpContext.SetupGet(c => c.Response).Returns(httpResponse);
httpContext.Setup(o => o.RequestServices.GetService(typeof(ILogger<ObjectResult>))) httpContext
.Returns(new Mock<ILogger<ObjectResult>>().Object); .Setup(o => o.RequestServices.GetService(typeof(ILoggerFactory)))
.Returns(NullLoggerFactory.Instance);
httpResponse.Body = new MemoryStream(); httpResponse.Body = new MemoryStream();
@ -2136,6 +2141,25 @@ namespace Microsoft.AspNet.Mvc.Controllers
throw _actionException; throw _actionException;
} }
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
private static HttpContext GetHttpContext()
{
var services = CreateServices();
var httpContext = new DefaultHttpContext();
httpContext.RequestServices = services.BuildServiceProvider();
return httpContext;
}
public IActionResult ActionMethodWithBodyParameter([FromBody] Person bodyParam) public IActionResult ActionMethodWithBodyParameter([FromBody] Person bodyParam)
{ {
return new ObjectResult(bodyParam); return new ObjectResult(bodyParam);

View File

@ -3,10 +3,14 @@
using System.IO; using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features;
using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Http.Internal;
using Microsoft.AspNet.Mvc.Abstractions; using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using Xunit; using Xunit;
@ -33,7 +37,7 @@ namespace Microsoft.AspNet.Mvc
// Arrange // Arrange
var buffer = new byte[] { 1, 2, 3, 4, 5 }; var buffer = new byte[] { 1, 2, 3, 4, 5 };
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
var outStream = new MemoryStream(); var outStream = new MemoryStream();
httpContext.Response.Body = outStream; httpContext.Response.Body = outStream;
@ -56,7 +60,7 @@ namespace Microsoft.AspNet.Mvc
var expectedContentType = "text/foo; charset=us-ascii"; var expectedContentType = "text/foo; charset=us-ascii";
var buffer = new byte[] { 1, 2, 3, 4, 5 }; var buffer = new byte[] { 1, 2, 3, 4, 5 };
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
var outStream = new MemoryStream(); var outStream = new MemoryStream();
httpContext.Response.Body = outStream; httpContext.Response.Body = outStream;
@ -80,7 +84,7 @@ namespace Microsoft.AspNet.Mvc
var expectedContentType = "text/foo; charset=us-ascii"; var expectedContentType = "text/foo; charset=us-ascii";
var buffer = new byte[] { 1, 2, 3, 4, 5 }; var buffer = new byte[] { 1, 2, 3, 4, 5 };
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
var bufferingFeature = new TestBufferingFeature(); var bufferingFeature = new TestBufferingFeature();
httpContext.Features.Set<IHttpBufferingFeature>(bufferingFeature); httpContext.Features.Set<IHttpBufferingFeature>(bufferingFeature);
var outStream = new MemoryStream(); var outStream = new MemoryStream();
@ -99,6 +103,25 @@ namespace Microsoft.AspNet.Mvc
Assert.True(bufferingFeature.DisableResponseBufferingInvoked); Assert.True(bufferingFeature.DisableResponseBufferingInvoked);
} }
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
private static HttpContext GetHttpContext()
{
var services = CreateServices();
var httpContext = new DefaultHttpContext();
httpContext.RequestServices = services.BuildServiceProvider();
return httpContext;
}
private class TestBufferingFeature : IHttpBufferingFeature private class TestBufferingFeature : IHttpBufferingFeature
{ {
public bool DisableResponseBufferingInvoked { get; private set; } public bool DisableResponseBufferingInvoked { get; private set; }

View File

@ -8,6 +8,9 @@ using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Http.Internal;
using Microsoft.AspNet.Mvc.Abstractions; using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using Moq; using Moq;
using Xunit; using Xunit;
@ -32,7 +35,7 @@ namespace Microsoft.AspNet.Mvc
// See comment in FileResult.cs detailing how the FileDownloadName should be encoded. // See comment in FileResult.cs detailing how the FileDownloadName should be encoded.
// Arrange // Arrange
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
var actionContext = CreateActionContext(httpContext); var actionContext = CreateActionContext(httpContext);
var result = new EmptyFileResult("application/my-type") var result = new EmptyFileResult("application/my-type")
@ -54,7 +57,7 @@ namespace Microsoft.AspNet.Mvc
public async Task ContentDispositionHeader_IsEncodedCorrectly_ForUnicodeCharacters() public async Task ContentDispositionHeader_IsEncodedCorrectly_ForUnicodeCharacters()
{ {
// Arrange // Arrange
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
var actionContext = CreateActionContext(httpContext); var actionContext = CreateActionContext(httpContext);
var result = new EmptyFileResult("application/my-type") var result = new EmptyFileResult("application/my-type")
@ -77,8 +80,12 @@ namespace Microsoft.AspNet.Mvc
{ {
// Arrange // Arrange
var httpContext = new Mock<HttpContext>(MockBehavior.Strict); var httpContext = new Mock<HttpContext>(MockBehavior.Strict);
httpContext.SetupSet(c => c.Response.ContentType = "application/my-type").Verifiable(); httpContext.SetupSet(c => c.Response.ContentType = "application/my-type").Verifiable();
httpContext.Setup(c => c.Response.Body).Returns(Stream.Null); httpContext.Setup(c => c.Response.Body).Returns(Stream.Null);
httpContext
.Setup(c => c.RequestServices.GetService(typeof(ILoggerFactory)))
.Returns(NullLoggerFactory.Instance);
var actionContext = CreateActionContext(httpContext.Object); var actionContext = CreateActionContext(httpContext.Object);
@ -96,7 +103,7 @@ namespace Microsoft.AspNet.Mvc
public async Task ExecuteResultAsync_SetsContentDisposition_IfSpecified() public async Task ExecuteResultAsync_SetsContentDisposition_IfSpecified()
{ {
// Arrange // Arrange
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
var actionContext = CreateActionContext(httpContext); var actionContext = CreateActionContext(httpContext);
var result = new EmptyFileResult("application/my-type") var result = new EmptyFileResult("application/my-type")
@ -207,6 +214,23 @@ namespace Microsoft.AspNet.Mvc
Assert.Equal(expectedOutput, actual); Assert.Equal(expectedOutput, actual);
} }
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
private static HttpContext GetHttpContext()
{
var services = CreateServices();
var httpContext = new DefaultHttpContext();
httpContext.RequestServices = services.BuildServiceProvider();
return httpContext;
}
private static ActionContext CreateActionContext(HttpContext context) private static ActionContext CreateActionContext(HttpContext context)
{ {
return new ActionContext(context, new RouteData(), new ActionDescriptor()); return new ActionContext(context, new RouteData(), new ActionDescriptor());

View File

@ -6,10 +6,14 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features;
using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Http.Internal;
using Microsoft.AspNet.Mvc.Abstractions; using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using Moq; using Moq;
using Xunit; using Xunit;
@ -52,7 +56,7 @@ namespace Microsoft.AspNet.Mvc
var result = new FileStreamResult(mockReadStream.Object, "text/plain"); var result = new FileStreamResult(mockReadStream.Object, "text/plain");
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
httpContext.Response.Body = mockBodyStream.Object; httpContext.Response.Body = mockBodyStream.Object;
var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
@ -76,7 +80,7 @@ namespace Microsoft.AspNet.Mvc
var originalStream = new MemoryStream(originalBytes); var originalStream = new MemoryStream(originalBytes);
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
var outStream = new MemoryStream(); var outStream = new MemoryStream();
httpContext.Response.Body = outStream; httpContext.Response.Body = outStream;
@ -104,7 +108,7 @@ namespace Microsoft.AspNet.Mvc
var originalStream = new MemoryStream(originalBytes); var originalStream = new MemoryStream(originalBytes);
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
var outStream = new MemoryStream(); var outStream = new MemoryStream();
httpContext.Response.Body = outStream; httpContext.Response.Body = outStream;
@ -130,7 +134,7 @@ namespace Microsoft.AspNet.Mvc
var originalStream = new MemoryStream(expected); var originalStream = new MemoryStream(expected);
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
var bufferingFeature = new TestBufferingFeature(); var bufferingFeature = new TestBufferingFeature();
httpContext.Features.Set<IHttpBufferingFeature>(bufferingFeature); httpContext.Features.Set<IHttpBufferingFeature>(bufferingFeature);
var outStream = new MemoryStream(); var outStream = new MemoryStream();
@ -148,5 +152,22 @@ namespace Microsoft.AspNet.Mvc
Assert.Equal(expectedContentType, httpContext.Response.ContentType); Assert.Equal(expectedContentType, httpContext.Response.ContentType);
Assert.True(bufferingFeature.DisableResponseBufferingInvoked); Assert.True(bufferingFeature.DisableResponseBufferingInvoked);
} }
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
private static HttpContext GetHttpContext()
{
var services = CreateServices();
var httpContext = new DefaultHttpContext();
httpContext.RequestServices = services.BuildServiceProvider();
return httpContext;
}
} }
} }

View File

@ -6,6 +6,9 @@ using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Http.Internal;
using Microsoft.AspNet.Mvc.Abstractions; using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Xunit; using Xunit;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
@ -26,7 +29,10 @@ namespace Microsoft.AspNet.Mvc
public async Task HttpOkResult_SetsStatusCode() public async Task HttpOkResult_SetsStatusCode()
{ {
// Arrange // Arrange
var context = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor()); var httpContext = new DefaultHttpContext();
httpContext.RequestServices = CreateServices().BuildServiceProvider();
var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
var result = new HttpOkResult(); var result = new HttpOkResult();
// Act // Act
@ -35,5 +41,12 @@ namespace Microsoft.AspNet.Mvc
// Assert // Assert
Assert.Equal(StatusCodes.Status200OK, context.HttpContext.Response.StatusCode); Assert.Equal(StatusCodes.Status200OK, context.HttpContext.Response.StatusCode);
} }
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
} }
} }

View File

@ -5,6 +5,9 @@ using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Http.Internal;
using Microsoft.AspNet.Mvc.Abstractions; using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Xunit; using Xunit;
namespace Microsoft.AspNet.Mvc namespace Microsoft.AspNet.Mvc
@ -17,7 +20,7 @@ namespace Microsoft.AspNet.Mvc
// Arrange // Arrange
var result = new HttpStatusCodeResult(StatusCodes.Status404NotFound); var result = new HttpStatusCodeResult(StatusCodes.Status404NotFound);
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
var routeData = new RouteData(); var routeData = new RouteData();
var actionDescriptor = new ActionDescriptor(); var actionDescriptor = new ActionDescriptor();
@ -29,5 +32,22 @@ namespace Microsoft.AspNet.Mvc
// Assert // Assert
Assert.Equal(StatusCodes.Status404NotFound, httpContext.Response.StatusCode); Assert.Equal(StatusCodes.Status404NotFound, httpContext.Response.StatusCode);
} }
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
private static HttpContext GetHttpContext()
{
var services = CreateServices();
var httpContext = new DefaultHttpContext();
httpContext.RequestServices = services.BuildServiceProvider();
return httpContext;
}
} }
} }

View File

@ -9,6 +9,7 @@ using System.Threading.Tasks;
using Microsoft.AspNet.Http; using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Http.Internal;
using Microsoft.AspNet.Mvc.Formatters; using Microsoft.AspNet.Mvc.Formatters;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing; using Microsoft.Extensions.Logging.Testing;
using Microsoft.Extensions.OptionsModel; using Microsoft.Extensions.OptionsModel;
@ -259,7 +260,7 @@ namespace Microsoft.AspNet.Mvc.Infrastructure
var actionContext = new ActionContext() var actionContext = new ActionContext()
{ {
HttpContext = new DefaultHttpContext(), HttpContext = GetHttpContext(),
}; };
var result = new ObjectResult("someValue"); var result = new ObjectResult("someValue");
@ -284,7 +285,7 @@ namespace Microsoft.AspNet.Mvc.Infrastructure
var actionContext = new ActionContext() var actionContext = new ActionContext()
{ {
HttpContext = new DefaultHttpContext(), HttpContext = GetHttpContext(),
}; };
var result = new ObjectResult("someValue"); var result = new ObjectResult("someValue");
@ -353,7 +354,7 @@ namespace Microsoft.AspNet.Mvc.Infrastructure
var actionContext = new ActionContext() var actionContext = new ActionContext()
{ {
HttpContext = new DefaultHttpContext(), HttpContext = GetHttpContext(),
}; };
actionContext.HttpContext.Request.Headers[HeaderNames.Accept] = acceptHeader; actionContext.HttpContext.Request.Headers[HeaderNames.Accept] = acceptHeader;
@ -390,7 +391,7 @@ namespace Microsoft.AspNet.Mvc.Infrastructure
var actionContext = new ActionContext() var actionContext = new ActionContext()
{ {
HttpContext = new DefaultHttpContext(), HttpContext = GetHttpContext(),
}; };
actionContext.HttpContext.Request.Headers[HeaderNames.Accept] = acceptHeader; actionContext.HttpContext.Request.Headers[HeaderNames.Accept] = acceptHeader;
@ -401,6 +402,25 @@ namespace Microsoft.AspNet.Mvc.Infrastructure
Assert.Equal(expectedContentType, actionContext.HttpContext.Response.Headers[HeaderNames.ContentType]); Assert.Equal(expectedContentType, actionContext.HttpContext.Response.Headers[HeaderNames.ContentType]);
} }
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
private static HttpContext GetHttpContext()
{
var services = CreateServices();
var httpContext = new DefaultHttpContext();
httpContext.RequestServices = services.BuildServiceProvider();
return httpContext;
}
private static TestObjectResultExecutor CreateExecutor( private static TestObjectResultExecutor CreateExecutor(
IOptions<MvcOptions> options = null, IOptions<MvcOptions> options = null,
ActionBindingContext bindingContext = null) ActionBindingContext bindingContext = null)

View File

@ -8,6 +8,7 @@ using Microsoft.AspNet.Http.Internal;
using Microsoft.AspNet.Mvc.Formatters; using Microsoft.AspNet.Mvc.Formatters;
using Microsoft.AspNet.Mvc.Infrastructure; using Microsoft.AspNet.Mvc.Infrastructure;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing; using Microsoft.Extensions.Logging.Testing;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using Xunit; using Xunit;
@ -68,6 +69,7 @@ namespace Microsoft.AspNet.Mvc
new TestOptionsManager<MvcOptions>(), new TestOptionsManager<MvcOptions>(),
new ActionBindingContextAccessor(), new ActionBindingContextAccessor(),
NullLoggerFactory.Instance)); NullLoggerFactory.Instance));
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services.BuildServiceProvider(); return services.BuildServiceProvider();
} }

View File

@ -6,10 +6,14 @@ using System.IO;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features;
using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Http.Internal;
using Microsoft.AspNet.Mvc.Abstractions; using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using Moq; using Moq;
using Xunit; using Xunit;
@ -37,7 +41,7 @@ namespace Microsoft.AspNet.Mvc
// Arrange // Arrange
var path = Path.GetFullPath(Path.Combine("TestFiles", "FilePathResultTestFile.txt")); var path = Path.GetFullPath(Path.Combine("TestFiles", "FilePathResultTestFile.txt"));
var result = new TestPhysicalFileResult(path, "text/plain"); var result = new TestPhysicalFileResult(path, "text/plain");
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
httpContext.Response.Body = new MemoryStream(); httpContext.Response.Body = new MemoryStream();
var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
@ -62,7 +66,7 @@ namespace Microsoft.AspNet.Mvc
.Setup(s => s.SendFileAsync(path, 0, null, CancellationToken.None)) .Setup(s => s.SendFileAsync(path, 0, null, CancellationToken.None))
.Returns(Task.FromResult<int>(0)); .Returns(Task.FromResult<int>(0));
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
httpContext.Features.Set(sendFileMock.Object); httpContext.Features.Set(sendFileMock.Object);
var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
@ -83,7 +87,7 @@ namespace Microsoft.AspNet.Mvc
{ {
IsAscii = true IsAscii = true
}; };
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
var memoryStream = new MemoryStream(); var memoryStream = new MemoryStream();
httpContext.Response.Body = memoryStream; httpContext.Response.Body = memoryStream;
var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
@ -104,7 +108,7 @@ namespace Microsoft.AspNet.Mvc
var path = Path.GetFullPath(Path.Combine(".", "TestFiles", "FilePathResultTestFile.txt")); var path = Path.GetFullPath(Path.Combine(".", "TestFiles", "FilePathResultTestFile.txt"));
var result = new TestPhysicalFileResult(path, "text/plain"); var result = new TestPhysicalFileResult(path, "text/plain");
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
httpContext.Response.Body = new MemoryStream(); httpContext.Response.Body = new MemoryStream();
var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
@ -136,7 +140,7 @@ namespace Microsoft.AspNet.Mvc
{ {
// Arrange // Arrange
var result = new TestPhysicalFileResult(path, "text/plain"); var result = new TestPhysicalFileResult(path, "text/plain");
var context = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor()); var context = new ActionContext(GetHttpContext(), new RouteData(), new ActionDescriptor());
var expectedMessage = $"Path '{path}' was not rooted."; var expectedMessage = $"Path '{path}' was not rooted.";
// Act // Act
@ -204,5 +208,22 @@ namespace Microsoft.AspNet.Mvc
} }
} }
} }
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
private static HttpContext GetHttpContext()
{
var services = CreateServices();
var httpContext = new DefaultHttpContext();
httpContext.RequestServices = services.BuildServiceProvider();
return httpContext;
}
} }
} }

View File

@ -8,6 +8,7 @@ using Microsoft.AspNet.Mvc.Infrastructure;
using Microsoft.AspNet.Mvc.Routing; using Microsoft.AspNet.Mvc.Routing;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Moq; using Moq;
using Xunit; using Xunit;
@ -110,6 +111,7 @@ namespace Microsoft.AspNet.Mvc
{ {
var serviceCollection = new ServiceCollection(); var serviceCollection = new ServiceCollection();
serviceCollection.AddInstance<IUrlHelper>(urlHelper); serviceCollection.AddInstance<IUrlHelper>(urlHelper);
serviceCollection.AddTransient<ILoggerFactory, LoggerFactory>();
return serviceCollection.BuildServiceProvider(); return serviceCollection.BuildServiceProvider();
} }

View File

@ -8,6 +8,9 @@ using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Mvc.Routing; using Microsoft.AspNet.Mvc.Routing;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.AspNet.Testing; using Microsoft.AspNet.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Moq; using Moq;
using Xunit; using Xunit;
@ -21,13 +24,19 @@ namespace Microsoft.AspNet.Mvc
// Arrange // Arrange
var expectedUrl = "SampleAction"; var expectedUrl = "SampleAction";
var expectedPermanentFlag = false; var expectedPermanentFlag = false;
var httpContext = new Mock<HttpContext>();
var httpResponse = new Mock<HttpResponse>();
httpContext.Setup(o => o.Response).Returns(httpResponse.Object);
var actionContext = new ActionContext(httpContext.Object, var httpContext = new Mock<HttpContext>();
new RouteData(), httpContext
new ActionDescriptor()); .SetupGet(o => o.RequestServices)
.Returns(CreateServices().BuildServiceProvider());
var httpResponse = new Mock<HttpResponse>();
httpContext
.Setup(o => o.Response)
.Returns(httpResponse.Object);
var actionContext = new ActionContext(httpContext.Object, new RouteData(), new ActionDescriptor());
var urlHelper = GetMockUrlHelper(expectedUrl); var urlHelper = GetMockUrlHelper(expectedUrl);
var result = new RedirectToActionResult("SampleAction", null, null) var result = new RedirectToActionResult("SampleAction", null, null)
{ {
@ -49,10 +58,14 @@ namespace Microsoft.AspNet.Mvc
{ {
// Arrange // Arrange
var httpContext = new Mock<HttpContext>(); var httpContext = new Mock<HttpContext>();
httpContext.Setup(o => o.Response).Returns(new Mock<HttpResponse>().Object); httpContext
var actionContext = new ActionContext(httpContext.Object, .Setup(o => o.Response)
new RouteData(), .Returns(new Mock<HttpResponse>().Object);
new ActionDescriptor()); httpContext
.SetupGet(o => o.RequestServices)
.Returns(CreateServices().BuildServiceProvider());
var actionContext = new ActionContext(httpContext.Object, new RouteData(), new ActionDescriptor());
var urlHelper = GetMockUrlHelper(returnValue: null); var urlHelper = GetMockUrlHelper(returnValue: null);
var result = new RedirectToActionResult(null, null, null) var result = new RedirectToActionResult(null, null, null)
@ -76,5 +89,12 @@ namespace Microsoft.AspNet.Mvc
return urlHelper.Object; return urlHelper.Object;
} }
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
} }
} }

View File

@ -10,7 +10,10 @@ using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Mvc.Routing; using Microsoft.AspNet.Mvc.Routing;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.AspNet.Testing; using Microsoft.AspNet.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Internal; using Microsoft.Extensions.Internal;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Moq; using Moq;
using Xunit; using Xunit;
@ -25,7 +28,10 @@ namespace Microsoft.AspNet.Mvc
// Arrange // Arrange
var expectedUrl = "SampleAction"; var expectedUrl = "SampleAction";
var expectedPermanentFlag = false; var expectedPermanentFlag = false;
var httpContext = new Mock<HttpContext>(); var httpContext = new Mock<HttpContext>();
httpContext.SetupGet(o => o.RequestServices).Returns(CreateServices().BuildServiceProvider());
var httpResponse = new Mock<HttpResponse>(); var httpResponse = new Mock<HttpResponse>();
httpContext.Setup(o => o.Response).Returns(httpResponse.Object); httpContext.Setup(o => o.Response).Returns(httpResponse.Object);
@ -54,10 +60,14 @@ namespace Microsoft.AspNet.Mvc
{ {
// Arrange // Arrange
var httpContext = new Mock<HttpContext>(); var httpContext = new Mock<HttpContext>();
httpContext.Setup(o => o.Response).Returns(new Mock<HttpResponse>().Object); httpContext
var actionContext = new ActionContext(httpContext.Object, .Setup(o => o.Response)
new RouteData(), .Returns(new Mock<HttpResponse>().Object);
new ActionDescriptor()); httpContext
.SetupGet(o => o.RequestServices)
.Returns(CreateServices().BuildServiceProvider());
var actionContext = new ActionContext(httpContext.Object, new RouteData(), new ActionDescriptor());
var urlHelper = GetMockUrlHelper(returnValue: null); var urlHelper = GetMockUrlHelper(returnValue: null);
var result = new RedirectToRouteResult(null, new Dictionary<string, object>()) var result = new RedirectToRouteResult(null, new Dictionary<string, object>())
@ -86,10 +96,16 @@ namespace Microsoft.AspNet.Mvc
.Verifiable(); .Verifiable();
var serviceProvider = new Mock<IServiceProvider>(); var serviceProvider = new Mock<IServiceProvider>();
serviceProvider.Setup(sp => sp.GetService(typeof(IUrlHelper))) serviceProvider
.Setup(sp => sp.GetService(typeof(IUrlHelper)))
.Returns(urlHelper.Object); .Returns(urlHelper.Object);
var httpContext = new DefaultHttpContext(); serviceProvider
.Setup(sp => sp.GetService(typeof(ILoggerFactory)))
.Returns(NullLoggerFactory.Instance);
var httpContext = GetHttpContext();
httpContext.RequestServices = serviceProvider.Object; httpContext.RequestServices = serviceProvider.Object;
var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
var result = new RedirectToRouteResult(routeName, new { id = 10 }); var result = new RedirectToRouteResult(routeName, new { id = 10 });
@ -103,6 +119,23 @@ namespace Microsoft.AspNet.Mvc
Assert.Equal(locationUrl, httpContext.Response.Headers["Location"]); Assert.Equal(locationUrl, httpContext.Response.Headers["Location"]);
} }
private static HttpContext GetHttpContext()
{
var services = CreateServices();
var httpContext = new DefaultHttpContext();
httpContext.RequestServices = services.BuildServiceProvider();
return httpContext;
}
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
public static IEnumerable<object[]> RedirectToRouteData public static IEnumerable<object[]> RedirectToRouteData
{ {
get get

View File

@ -7,11 +7,14 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.FileProviders; using Microsoft.AspNet.FileProviders;
using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features;
using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Http.Internal;
using Microsoft.AspNet.Mvc.Abstractions; using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using Moq; using Moq;
using Xunit; using Xunit;
@ -44,10 +47,11 @@ namespace Microsoft.AspNet.Mvc
appEnvironment.Setup(app => app.WebRootFileProvider) appEnvironment.Setup(app => app.WebRootFileProvider)
.Returns(GetFileProvider(path)); .Returns(GetFileProvider(path));
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
httpContext.Response.Body = new MemoryStream(); httpContext.Response.Body = new MemoryStream();
httpContext.RequestServices = new ServiceCollection() httpContext.RequestServices = new ServiceCollection()
.AddInstance<IHostingEnvironment>(appEnvironment.Object) .AddInstance<IHostingEnvironment>(appEnvironment.Object)
.AddTransient<ILoggerFactory, LoggerFactory>()
.BuildServiceProvider(); .BuildServiceProvider();
var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
@ -71,7 +75,7 @@ namespace Microsoft.AspNet.Mvc
FileProvider = GetFileProvider(path), FileProvider = GetFileProvider(path),
}; };
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
httpContext.Response.Body = new MemoryStream(); httpContext.Response.Body = new MemoryStream();
var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
@ -100,7 +104,7 @@ namespace Microsoft.AspNet.Mvc
.Setup(s => s.SendFileAsync(path, 0, null, CancellationToken.None)) .Setup(s => s.SendFileAsync(path, 0, null, CancellationToken.None))
.Returns(Task.FromResult<int>(0)); .Returns(Task.FromResult<int>(0));
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
httpContext.Features.Set(sendFileMock.Object); httpContext.Features.Set(sendFileMock.Object);
var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
@ -123,7 +127,7 @@ namespace Microsoft.AspNet.Mvc
IsAscii = true, IsAscii = true,
}; };
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
var memoryStream = new MemoryStream(); var memoryStream = new MemoryStream();
httpContext.Response.Body = memoryStream; httpContext.Response.Body = memoryStream;
var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
@ -147,7 +151,7 @@ namespace Microsoft.AspNet.Mvc
FileProvider = GetFileProvider(path), FileProvider = GetFileProvider(path),
}; };
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
httpContext.Response.Body = new MemoryStream(); httpContext.Response.Body = new MemoryStream();
var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var context = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
@ -175,7 +179,7 @@ namespace Microsoft.AspNet.Mvc
{ {
FileProvider = GetFileProvider(path), FileProvider = GetFileProvider(path),
}; };
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
var memoryStream = new MemoryStream(); var memoryStream = new MemoryStream();
httpContext.Response.Body = memoryStream; httpContext.Response.Body = memoryStream;
@ -194,7 +198,7 @@ namespace Microsoft.AspNet.Mvc
public async Task ExecuteResultAsync_WorksWithNonDiskBasedFiles() public async Task ExecuteResultAsync_WorksWithNonDiskBasedFiles()
{ {
// Arrange // Arrange
var httpContext = new DefaultHttpContext(); var httpContext = GetHttpContext();
httpContext.Response.Body = new MemoryStream(); httpContext.Response.Body = new MemoryStream();
var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
var expectedData = "This is an embedded resource"; var expectedData = "This is an embedded resource";
@ -249,7 +253,7 @@ namespace Microsoft.AspNet.Mvc
}; };
var expectedMessage = "Could not find file: " + path; var expectedMessage = "Could not find file: " + path;
var context = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor()); var context = new ActionContext(GetHttpContext(), new RouteData(), new ActionDescriptor());
// Act // Act
var ex = await Assert.ThrowsAsync<FileNotFoundException>(() => filePathResult.ExecuteResultAsync(context)); var ex = await Assert.ThrowsAsync<FileNotFoundException>(() => filePathResult.ExecuteResultAsync(context));
@ -286,6 +290,25 @@ namespace Microsoft.AspNet.Mvc
Assert.ThrowsAsync<DirectoryNotFoundException>(() => filePathResult.ExecuteResultAsync(context)); Assert.ThrowsAsync<DirectoryNotFoundException>(() => filePathResult.ExecuteResultAsync(context));
} }
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
private static HttpContext GetHttpContext()
{
var services = CreateServices();
var httpContext = new DefaultHttpContext();
httpContext.RequestServices = services.BuildServiceProvider();
return httpContext;
}
private IFileProvider GetFileProvider(string path) private IFileProvider GetFileProvider(string path)
{ {
var fileInfo = new Mock<IFileInfo>(); var fileInfo = new Mock<IFileInfo>();

View File

@ -11,6 +11,9 @@ using Microsoft.AspNet.Http.Internal;
using Microsoft.AspNet.Mvc.Abstractions; using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Mvc.Filters; using Microsoft.AspNet.Mvc.Filters;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Moq; using Moq;
using Xunit; using Xunit;
@ -140,6 +143,10 @@ namespace Microsoft.AspNet.Mvc.Cors
httpContext.Request.Headers.Add(CorsConstants.Origin, new[] { headers.Origin }); httpContext.Request.Headers.Add(CorsConstants.Origin, new[] { headers.Origin });
} }
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
httpContext.RequestServices = services.BuildServiceProvider();
var method = isPreflight ? CorsConstants.PreflightHttpMethod : "GET"; var method = isPreflight ? CorsConstants.PreflightHttpMethod : "GET";
httpContext.Request.Method = method; httpContext.Request.Method = method;

View File

@ -11,6 +11,8 @@ using Microsoft.AspNet.Http.Internal;
using Microsoft.AspNet.Mvc.Abstractions; using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using Newtonsoft.Json; using Newtonsoft.Json;
using Xunit; using Xunit;
@ -128,8 +130,10 @@ namespace Microsoft.AspNet.Mvc
{ {
var httpContext = new DefaultHttpContext(); var httpContext = new DefaultHttpContext();
httpContext.Response.Body = new MemoryStream(); httpContext.Response.Body = new MemoryStream();
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddOptions(); services.AddOptions();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
httpContext.RequestServices = services.BuildServiceProvider(); httpContext.RequestServices = services.BuildServiceProvider();
return httpContext; return httpContext;

View File

@ -75,6 +75,11 @@ namespace Microsoft.AspNet.Mvc
.Setup(v => v.Dispose()) .Setup(v => v.Dispose())
.Verifiable(); .Verifiable();
// Used by logging
view
.SetupGet(v => v.Path)
.Returns("myview.cshtml");
var viewEngine = new Mock<IViewEngine>(MockBehavior.Strict); var viewEngine = new Mock<IViewEngine>(MockBehavior.Strict);
viewEngine viewEngine
.Setup(e => e.FindPartialView(context, "myview")) .Setup(e => e.FindPartialView(context, "myview"))

View File

@ -16,6 +16,8 @@ using Microsoft.AspNet.Mvc.ViewComponents;
using Microsoft.AspNet.Mvc.ViewFeatures; using Microsoft.AspNet.Mvc.ViewFeatures;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Microsoft.Extensions.OptionsModel; using Microsoft.Extensions.OptionsModel;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using Xunit; using Xunit;
@ -397,6 +399,7 @@ namespace Microsoft.AspNet.Mvc
services.AddSingleton<IViewComponentActivator, DefaultViewComponentActivator>(); services.AddSingleton<IViewComponentActivator, DefaultViewComponentActivator>();
services.AddInstance<IViewComponentDescriptorProvider>(new FixedSetViewComponentDescriptorProvider(descriptors)); services.AddInstance<IViewComponentDescriptorProvider>(new FixedSetViewComponentDescriptorProvider(descriptors));
services.AddSingleton<IModelMetadataProvider, EmptyModelMetadataProvider>(); services.AddSingleton<IModelMetadataProvider, EmptyModelMetadataProvider>();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services; return services;
} }

View File

@ -75,6 +75,10 @@ namespace Microsoft.AspNet.Mvc
.Setup(v => v.Dispose()) .Setup(v => v.Dispose())
.Verifiable(); .Verifiable();
view
.Setup(v => v.Path)
.Returns("//location");
var viewEngine = new Mock<IViewEngine>(MockBehavior.Strict); var viewEngine = new Mock<IViewEngine>(MockBehavior.Strict);
viewEngine viewEngine
.Setup(e => e.FindView(context, "myview")) .Setup(e => e.FindView(context, "myview"))

View File

@ -7,6 +7,9 @@ using Microsoft.AspNet.Http.Internal;
using Microsoft.AspNet.Mvc; using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Abstractions; using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Microsoft.Framework.DependencyInjection;
using Xunit; using Xunit;
namespace System.Web.Http namespace System.Web.Http
@ -17,7 +20,7 @@ namespace System.Web.Http
public async Task ConflictResult_SetsStatusCode() public async Task ConflictResult_SetsStatusCode()
{ {
// Arrange // Arrange
var context = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor()); var context = new ActionContext(GetHttpContext(), new RouteData(), new ActionDescriptor());
var result = new ConflictResult(); var result = new ConflictResult();
// Act // Act
@ -26,5 +29,24 @@ namespace System.Web.Http
// Assert // Assert
Assert.Equal(StatusCodes.Status409Conflict, context.HttpContext.Response.StatusCode); Assert.Equal(StatusCodes.Status409Conflict, context.HttpContext.Response.StatusCode);
} }
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
private static HttpContext GetHttpContext()
{
var services = CreateServices();
var httpContext = new DefaultHttpContext();
httpContext.RequestServices = services.BuildServiceProvider();
return httpContext;
}
} }
} }

View File

@ -7,6 +7,9 @@ using Microsoft.AspNet.Http.Internal;
using Microsoft.AspNet.Mvc; using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Abstractions; using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Microsoft.Framework.DependencyInjection;
using Xunit; using Xunit;
namespace System.Web.Http namespace System.Web.Http
@ -17,7 +20,7 @@ namespace System.Web.Http
public async Task InternalServerErrorResult_SetsStatusCode() public async Task InternalServerErrorResult_SetsStatusCode()
{ {
// Arrange // Arrange
var context = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor()); var context = new ActionContext(GetHttpContext(), new RouteData(), new ActionDescriptor());
var result = new InternalServerErrorResult(); var result = new InternalServerErrorResult();
// Act // Act
@ -26,5 +29,24 @@ namespace System.Web.Http
// Assert // Assert
Assert.Equal(StatusCodes.Status500InternalServerError, context.HttpContext.Response.StatusCode); Assert.Equal(StatusCodes.Status500InternalServerError, context.HttpContext.Response.StatusCode);
} }
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
services.AddInstance<ILoggerFactory>(NullLoggerFactory.Instance);
return services;
}
private static HttpContext GetHttpContext()
{
var services = CreateServices();
var httpContext = new DefaultHttpContext();
httpContext.RequestServices = services.BuildServiceProvider();
return httpContext;
}
} }
} }