0

幾個月前,我編寫了一個帶有一些自定義屬性的WebApi應用程序。它效果很好。控制器上的mvc 5屬性被忽略

我現在正在編寫一個新的MVC 5.2.3網站,並希望包含相同的屬性。我將它們移動過來,項目的構建和運行都很好,只是屬性被忽略了。

這是我的控制器裝飾:

[AuthorizeIt(Roles = "theRole")] 
[LogRequestResponse] 
public class HomeController : Controller{} 

這是我的兩個屬性的簽名:

public class LogRequestResponseAttribute : ActionFilterAttribute 


[AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = true)] 
public class AuthorizeItAttribute : AuthorizeAttribute 

我可以包括更多的代碼,但我不認爲它實際上是因爲一個代碼問題它在我的其他網站上工作。我的猜測是MVC和WebApi之間的差異,並且我缺少一些細節。

是的,我知道ASP.core集成webApi和MVC,並將解決我面臨的問題,但我的工作將不會允許這樣做。

感謝,

鮑勃

+0

附加信息:新信息:如果我改變我的控制器從ApiController繼承我的屬性,做工精細。改回來,他們沒有。 – Bob

回答

0

我大部分解決了我的問題,並有我解決不了最後一個項目。 簡而言之,在屬性的最高級別上,WebAPI和MVC似乎具有相同的對象,但隨着深入,事情會變得不同。

例如:根據您使用的命名空間,AuthorizeAttribute是非常不同的。 MVC版本需要一個AuthorizationContext參數,而WebApi需要一個HttpActionContext。

另一個例子是OnActionExecuted函數想要一個ActionExecutedContext作爲MVC的參數,但webApi需要一個HttpActionExecutedContext。

底線是我能做的就是把我的原始WebApi屬性放到我的MVC項目中,然後從頂部開始,確保你在MVC命名空間,然後開始下鑽並根據需要更改對象。

我能找到每個webApi代碼的MVC等價物,除了一個代碼。

有關的WebAPI,在OnActionExecuted功能,我可以得到與響應的內容:

var response = actionContext.Response?.Content?.ReadAsStringAsync().Result; 

其中:

actionContext is a HttpActionExecutedContext 

但在MVC

actionContext is a ActionExecutedContext 

所以上面得到響應的webapi代碼在MVC中不起作用。 從我一直在閱讀MVC中的響應內容是什麼位於:

actionContext.HttpContext.Response.Filter 

這是一個流。但是,無論我嘗試讀取流的方式有多少種,它總是處於不可讀狀態。

我的問題的最後一個懸而未決的部分是:

MVC 5:我寫的自定義屬性。我在功能:

public override void OnActionExecuted(ActionExecutedContext actionContext) 

而且我想讀取響應內容,以便我可以例如記錄它或改變它,或任何。

總結:

  1. 一般的解決問題的辦法就是認真開始在定製的頂級屬性,名稱空間更改爲MVC,然後通過代碼工作更換的WebAPI碼與MVC相當。非常煩人和乏味。如果有人正在嘗試類似的東西,並有問題,我很樂意提供幫助。

  2. 有一段代碼我找不到譯文,希望別人知道答案。

感謝....鮑勃