question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Intercept action controller with arguments in mvc 5 throw exception

See original GitHub issue

I’m not able to intercept a controller action with arguments. I’m using Asp.Net MVC 5.2.6 with LightInject 5.1.3 and LightInject.Interception 2.0.0. I receive the following error:

Server Error in '/' Application.
Unable to cast object of type 'System.Object[]' to type 'System.Web.Mvc.CustomModelBinderAttribute[]'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidCastException: Unable to cast object of type 'System.Object[]' to type 'System.Web.Mvc.CustomModelBinderAttribute[]'.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

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

My code is (I do not insert views because are meaningless):

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

My Controller is:

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

Issue Analytics

  • State:closed
  • Created 5 years ago
  • Comments:7 (7 by maintainers)

github_iconTop GitHub Comments

1reaction
seesharpercommented, May 28, 2018

That’s it. Adding the parameter name to the proxy method seems to fix the issue

0reactions
seesharpercommented, Jun 5, 2018

@zu1779 LightInject.Interception 2.0.1 is now available from the official NuGet feed

Read more comments on GitHub >

github_iconTop Results From Across the Web

ASP.NET MVC 5 - Handling Exceptions with some simpler ...
1. Use try-catch local to each action method. · 2. Use and override OnException method of the Controller base class. · 3. Handling...
Read more >
How to get the parameter values of a Controller Action in ...
I have a simple DemoController that has an endpoint Greeting(string message) with a message parameter. The endpoint will throw an exception ...
Read more >
Exception Handling in MVC
OnException is a void method that takes an argument as an object of ExceptionContext that has all the information about the exception that...
Read more >
Exception Handling in ASP.NET Web API
An exception filter is executed when a controller method throws any unhandled exception that is not an HttpResponseException exception. The ...
Read more >
Explain Exception Handling in ASP.NET MVC
Another way to handle exceptions in controller level by overriding the OnException() method in the controller class. This method deals with all ...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found