2013-08-19 9 views
6

Potrzebuję utworzyć pewne akcje kontrolera pomocnika i powiązane z nimi widoki, które chciałbym (warunkowo?) Wyłączyć w produkcji.ASP.NET MVC, jak wyłączyć debugowanie tras/widoków w produkcji?

Jednym ze sposobów jest #ifdef DEBUG pragma wokół poszczególnych tras w ciele RegisterRoutes(), ale to wcale nie jest elastyczne.

Ustawienie w web.config byłoby równie dobre, ale nie jestem pewien, jak to połączyć.

Jak ustalone „wtyczki” projekty takie jak Glimpse lub Phil Haack Starsze Route Debugger zrobić?

wolałbym zrobić coś prostego, niż coś YAGNI ...

Odpowiedz

2
@if (HttpContext.Current.IsDebuggingEnabled) 
{ 
} 

Class

public class UrlInformation 
{ 
    [XmlElement(ElementName = "ActionName")] 
    public string ActionName { get; set; } 

    [XmlElement(ElementName = "ControllerName")] 
    public string ControllerName { get; set; } 

    [XmlElement(ElementName = "AreaName")] 
    public string AreaName { get; set; } 
} 

Klasa dla XML Serializaion

[XmlTypeAttribute(AnonymousType = true)] 
public class clsUrlInformation 
{ 
    [XmlElement("Files")] 
    public List<UrlInformation> Url { get; set; } 

    public clsUrlInformation() 
    { 
     Url = new List<UrlInformation>(); 
    } 
} 

Sample XML (Definiowanie nazw metoda działania debug/kontroler/powierzchnia tutaj)

<?xml version="1.0" ?> 
<Url> 
    <Files> 
    <AreaName></AreaName> 
    <ControllerName>Home</ControllerName> 
    <ActionName>Index</ActionName> 
    </Files> 
    <Files> 
    <AreaName></AreaName> 
    <ControllerName></ControllerName> 
    <ActionName></ActionName> 
    </Files>      
</Url> 

Działanie filtra

public class MyActionClass : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(
             ActionExecutingContext filterContext) 
    { 

Powiedzmy masz XML. XML zawiera informacje o obszarze, metody działania Imię i Controller Nazwa

var xml = 
@"<?xml version=""1.0"" ?> 
<Url> 
    <Files> 
    <AreaName></AreaName> 
    <ControllerName>Home</ControllerName> 
    <ActionName>Index</ActionName> 
    </Files> 
    <Files> 
    <AreaName></AreaName> 
    <ControllerName></ControllerName> 
    <ActionName></ActionName> 
    </Files>      
</Url>"; 

Doing serializacji XML i przekształcić XML do listy klasy.

 var serializer = new XmlSerializer(typeof(clsUrlInformation), 
           new XmlRootAttribute("Url")); 
     using (var stringReader = new StringReader(xml)) 
     using (var reader = XmlReader.Create(stringReader)) 
     { 
      clsUrlInformation result = 
        (clsUrlInformation)serializer.Deserialize(reader); 
      RouteData Route = 
        filterContext.Controller.ControllerContext.RouteData; 
      String controller = Convert.ToString(Route.Values["controller"]); 
      String action = Convert.ToString(Route.Values["action"]); 
      String area = Convert.ToString(Route.DataTokens["area"]); 

Porównując obecną akcję z XML, tak aby pokazać 404

  foreach (var item in result.Url) 
      { 
       if (HttpContext.Current.IsDebuggingEnabled && 
          controller == item.ControllerName && 
           action == item.ActionName  && 
            area == item.AreaName) 
       { 
        filterContext.Result = new HttpNotFoundResult(); 
        return; 
       } 
      } 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

@CristiDiaconescu: podając adres URL debugowania w pliku XML będzie bardziej elastyczny. CZEMU? Ponieważ później możesz dokonać modyfikacji w swoim XML, aby zwiększyć/zmniejszyć/zaktualizować informacje o adresie URL bez zmiany kodu i bez instalowania biblioteki dll. Czy nie tak?

+0

Twoje pierwsze dwa podejścia wyglądają jak kod Razor, w którym to momencie może być już za późno - wolałbym mieć (debugowany) URL (s)) ", które można wyłączyć - tj. trafienie ich zwróci 404, a nie stronę ustom (pustą?). Jednak +1 dla HttpContext.Current.IsDebuggingEnabled –

+0

@CristiDiaconescu: ** [Zamiast wspomnieć o trasach w pliku kodu, można wspomnieć w pliku XML, jak wspomniano w tym wpisie] (http://stackoverflow.com/a/ 18362259/2015869) ** –

+0

@CristiDiaconescu: Wzmianka o adresach URL debugowania w pliku XML będzie bardziej elastyczna. CZEMU? Ponieważ później możesz dokonać modyfikacji w swoim XML, aby zwiększyć/zmniejszyć/zaktualizować informacje o adresie URL bez zmiany kodu i bez instalowania biblioteki dll. Czy nie tak? –

9

Można również użyć filtru, np rzucić tę klasę gdzieś:

public class DebugOnlyAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(
              ActionExecutingContext filterContext) 
     { 
      #if DEBUG 
      #else 
       filterContext.Result = new HttpNotFoundResult(); 
      #endif 
     } 
    } 

Wtedy można tylko spaść do sterownika i ozdobić metod akcji (lub całych kontrolerów) nie potrzebują pojawią się w produkcji pod numerem [DebugOnly].

Można również użyć filterContext.HttpContext.IsDebuggingEnabled zamiast brzydsze #if DEBUG chcę tylko być skłonny użyć dyrektywy prekompilatora ponieważ decyzja jest zdecydowanie nie zamierza podejmować żadnych cykl procesora w ten sposób.

Jeśli zamiast tego chcesz filtr globalny aby sprawdzić wszystko przed kilkoma adresami URL, zarejestrować go jako filtr globalnej w Global.asax:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) { 

    filters.Add(new DebugActionFilter()); 
} 

Następnie można po prostu sprawdzić adres URL lub cokolwiek chcesz przeciwko list (tutaj pokazana ścieżka aplikacji):

public class DebugActionFilter : IActionFilter 
{ 
    private List<string> DebugUrls = new List<string> {"~/Home/", 
                 "~/Debug/"}; 
    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!filterContext.HttpContext.IsDebuggingEnabled 
      && DebugUrls.Contains(
         filterContext 
        .HttpContext 
        .Request 
        .AppRelativeCurrentExecutionFilePath)) 
     { 
      filterContext.Result = new HttpNotFoundResult(); 
     } 
    } 

    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
    } 
} 
+0

To wygląda na czyste. Dzięki! –

Powiązane problemy