Asp.net-Web-Api

將一個對像從 ActionFilter.OnActionExecuting() 傳遞給 ApiController

  • October 30, 2017

我希望在 ActionFilter 中為每個 http 請求創建一個對象,並將該對像傳遞給控制器。到目前為止,我已經嘗試過 Request.Properties[] 如下

public class DbReadonlyAttribute : ActionFilterAttribute
{
   public override void OnActionExecuting(HttpActionContext actionContext)
   {
       actionContext.Request.Properties["CustomObjectKey"] = new MyClass();

而且我還嘗試將新對象直接分配給 ControllerBase 類。

public class DbReadonlyAttribute : ActionFilterAttribute
{
   public override void OnActionExecuting(HttpActionContext actionContext)
   {
       var controller = (MyControllerBase) actionContext.ControllerContext.Controller;
       controller.StorageContextFactory = new MyClass();

問題是這兩種技術都沒有向控制器傳遞 MyClass 的實例,因為在呼叫控制器方法時,新的 Property[“CustomObjectKey”] 在 Webapi 管道中失去了。

在呼叫操作過濾器 OnActionExecuting() 之後,控制器由 webapi 管道重新實例化。

斷點確認 Webapi 管道在單個 http 請求期間安排以下事件流。

  • 建構子 MyControllerBase()
  • 我的身份驗證過濾器
  • 過濾 OnActionExecuting()
  • 建構子 MyControllerBase()
  • MyController.MethodA()

MyControler 的雙重實例化很奇怪,但現在我正在尋找任何技術將新創建的對像從動作過濾器傳遞到控制器。

Edit-1:這個問題 v1 中提到的 MyAuthorizationFilter 實際上是一個身份驗證過濾器。還在調查。

解決方案:該錯誤在另一個過濾器中。刪除身份驗證過濾器後,此問題中報告的問題消失了。

您將不得不使用.add方法Request.Properties集合。

public class DbReadonlyAttribute : ActionFilterAttribute
{
   public override void OnActionExecuting(HttpActionContext actionContext)
   {
       actionContext.Request.Properties.Add(new KeyValuePair<string, object>("CustomObjectKey", new MyClass()));

您可以從您的 api 控制器中檢索此值。

object _customObject= null;

if (Request.Properties.TryGetValue("CustomObjectKey", out _customObjectKey))
{
   MyClass myObject = (MyClass)_customObject;
}

引用自:https://stackoverflow.com/questions/28357141