2017-08-17 102 views
0

我們正試圖排除我們的生產代碼的某些控制器(我們暴露了我們的綜合UI測試所需的API操縱某些端點)剔除生產代碼

看一看下面的片段控制器,你能看到遵循這種方法會有什麼根本錯誤?

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
public class NonProductionAttribute : ApiExplorerSettingsAttribute, IActionFilter 
{ 
    public NonProductionAttribute() 
    { 
     IgnoreApi = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == EnvironmentName.Production; 
    } 

    public void OnActionExecuted(ActionExecutedContext context) { } 

    public void OnActionExecuting(ActionExecutingContext context) 
    { 
     if (IgnoreApi) 
     { 
      context.Result = new NotFoundResult(); 
     } 
    } 
} 

所以基本上我們只是與非生產性屬性裝點「得罪」控制器,我從ApiExplorerSettingsAttribute繼承排除從生成的文檔控制器。

一個問題可能是使用環境變量,也許以某種方式從IHostingEnvironment獲取它?

或者你會建議一個完全不同的選擇(用於排除控制器)?

+2

您可以將環境變量放在web.config中,然後轉換每個環境的配置。我以前做過這個,效果很好 –

+0

我認爲env變量部分很好,除非你可以使用[config]來抽象這個(https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration#using-options-and-configuration-objects),唯一值得關注的是你將在路由表中擁有所有這些非prod路由。它也感覺有點冒險,如果做錯了事情可能會泄漏到產品中,則存在風險。你可以看看構建時間過程來做同樣的事情。 – Matt

+0

@Matt我的初始設計涉及到構建過程,只包括需要什麼 – cstruter

回答

1

將所有「TestOnly」MVCControllers和/或ApiControllers移到它自己的區域。這可以幫助您更快地識別僅測試代碼。

在你的區域註冊中,根本不要註冊任何基於服務器/環境的路由。

如果你沒有指定路由,asp.net會爲你返回一個404。

你甚至可以走這麼遠,將所有的測試代碼移動到它自己的程序集中,幷包含它(如果需要),甚至不會在prod上構建/部署它。 https://blog.longle.io/2012/03/29/building-a-composite-mvc3-application-with-pluggable-areas/

+0

我試圖使用區域方法(.net核心),但有問題讓它在我的mac上正確路由......(對我的舊項目工作正常)也許我必須再試一次嗎?大概只是錯過了一些小東西 – cstruter

+1

Ahh成功:D,想我會按照這個方法 – cstruter