是否可以发布/获取未映射到动作参数的参数? 我的意思是做什么样的事情
$.ajax({ url: url, data: {'id'=7,'CorrelationToken'=correlationToken } })
其中correlationToken只能从httpRequest或"控制器级别"领域? E.g。
class myController: ApiController
{
Guid CorrelationToken {get; set;}
public void Action(int id)
{
// ...
}
}
答案 0 :(得分:1)
这样做的一种方法是编写一个自定义控制器工厂 将读取请求发布的值,然后将值分配给它创建的控制器。
像这样的东西(未经过测试,但你应该明白这一点):
public class My_Controller_Factory : DefaultControllerFactory
{
public override IController CreateController
(System.Web.Routing.RequestContext requestContext, string controllerName)
{
string controllername = requestContext.RouteData.Values["controller"].ToString();
Type controllerType = Type.GetType(string.Format(
"Custom_Controller_Factory.Controllers.{0}",controllername));
IController controller = Activator.CreateInstance(controllerType) as IController;
if (controllerName == "MyController")
((MyController)IController).CorrelationToken = Request["CorrelationToken"];
return controller;
}
public override void ReleaseController(IController controller)
{
IDisposable dispose = controller as IDisposable;
if (dispose != null)
{
dispose.Dispose();
}
}
}
见这里:
http://www.codeproject.com/Tips/732449/Understanding-and-Extending-Controller-Factory-i
也许更简单的方法是简单地在控制器构造函数中设置值。
public class MyController : Controller
{
public MyController()
{
CorrelationToken = Request["CorrelationToken"];
}
}
但是,这里的现实是你可能不需要这样做。您的CorrlationToken可能仅用于记录,并且只需在需要时使用Request本身就很容易。
Log.Debug("CorrlelationToken: {0}", Request["CorrelationToken"]);