引数を使用してコントローラー アクションをインターセプトできません。LightInject と LightInject.Interception で Asp.Net MVC 5 を使用しています。次のエラーが表示されます。
タイプ 'System.Object[]' のオブジェクトをタイプ 'System.Web.Mvc.CustomModelBinderAttribute[]' にキャストできません。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。
例外の詳細: System.InvalidCastException: タイプ 'System.Object[]' のオブジェクトをタイプ 'System.Web.Mvc.CustomModelBinderAttribute[]' にキャストできません。
ソース エラー:
現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。
Stack Trace:
[InvalidCastException: Unable to cast object of type 'System.Object[]' to type 'System.Web.Mvc.CustomModelBinderAttribute[]'.]
System.Web.Mvc.ModelBinders.GetBinderFromAttributes(ICustomAttributeProvider element, Action`1 errorAction) +42
System.Web.Mvc.ReflectedParameterBindingInfo.get_Binder() +102
System.Web.Mvc.ControllerActionInvoker.GetModelBinder(ParameterDescriptor parameterDescriptor) +28
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +38
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +105
System.Web.Mvc.Async.<>c__DisplayClass3_1.<BeginInvokeAction>b__0(AsyncCallback asyncCallback, Object asyncState) +640
System.Web.Mvc.Async.WrappedAsyncResult`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +14
System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +128
System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +346
System.Web.Mvc.<>c.<BeginExecuteCore>b__152_0(AsyncCallback asyncCallback, Object asyncState, ExecuteCoreState innerState) +27
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +30
System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +128
System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +494
System.Web.Mvc.<>c.<BeginExecute>b__151_1(AsyncCallback asyncCallback, Object callbackState, Controller controller) +16
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +20
System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +128
System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +403
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +16
System.Web.Mvc.<>c.<BeginProcessRequest>b__20_0(AsyncCallback asyncCallback, Object asyncState, ProcessRequestState innerState) +54
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +30
System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +128
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +427
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +48
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +103
System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +48
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +159
私のコードは次のとおりです(意味がないため、ビューを挿入しません):
// Global.asax
namespace TestMVCInjection
{
using System;
using System.Diagnostics;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using LightInject;
using LightInject.Interception;
using TestMVCInjection.Controllers;
public class MvcApplication : HttpApplication
{
public void Application_Start()
{
AreaRegistration.RegisterAllAreas();
//FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
GlobalFilters.Filters.Add(new HandleErrorAttribute());
//RouteConfig.RegisterRoutes(RouteTable.Routes);
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
RegisterLightInject();
}
private void RegisterLightInject()
{
var container = new ServiceContainer();
container.RegisterControllers();
container.EnableMvc();
container.Intercept((ServiceRegistration c) => c.ServiceType == typeof(HomeController), (IServiceFactory c) => (IInterceptor)new DebugInterceptor());
}
}
public class DebugInterceptor : IInterceptor
{
public object Invoke(IInvocationInfo invocationInfo)
{
object returnValue = null;
// Verifico se devo intercettare il metodo
var mi = invocationInfo.Method;
var sw = Stopwatch.StartNew();
string timestamp = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fff \"GMT\"zzz");
string method = $"{invocationInfo.Method.DeclaringType.Name}.{invocationInfo.Method.Name}";
try
{
var parNames = invocationInfo.Method.GetParameters().Select(d => $"{d.Name}: {d.ParameterType}").ToList();
var parValues = invocationInfo.Arguments.Select(c => $"{c}").ToList();
string parameters = string.Join(Environment.NewLine, parNames.Select((n, i) => $"{parNames[i]} = {parValues[i]}"));
string message = $"{nameof(timestamp).ToUpper()}={timestamp}{Environment.NewLine}{nameof(method).ToUpper()}={method}{Environment.NewLine}{nameof(parameters).ToUpper()}{Environment.NewLine}{parameters}";
Debug.WriteLine(message);
returnValue = invocationInfo.Proceed();
message = $"TOOK {nameof(sw.ElapsedMilliseconds)} = {sw.ElapsedMilliseconds} for returning {returnValue} for method {method}";
Debug.WriteLine(message);
return returnValue;
}
catch (Exception)
{
string message = $"Took {nameof(sw.ElapsedMilliseconds)} = {sw.ElapsedMilliseconds} for throwing an exception method {method}";
Debug.WriteLine(message);
throw;
}
}
}
}
私のコントローラーは:
namespace TestMVCInjection.Controllers
{
using System.Diagnostics;
using System.Web.Mvc;
public class HomeController : Controller
{
public virtual ActionResult Index(string id)
{
Debug.WriteLine("-----> INDEX START <-----");
var response = View((object)id);
Debug.WriteLine("-----> INDEX END <-----");
return response;
}
}
}
誰かが私を正しい道に導いてくれることを願っています。