RSS FeedFeed TwitterTwitter XINGXING
  
Meine Bücher

Verteilte Systeme und Services mit .NET 4.0: Konzepte und Lösungen mit WCF 4.0,
Hanser Fachbuchverlag

Weitere Infos

 

.NET 4 Update,
Microsoft Press

Weitere Infos

 
Weitere Bücher
Meine Artikel

Leichtgewichtige Kommunikation: REST-basierte Services mit dem neuen API aus der ASP.NET-Familie,
windows.developer

Weitere Infos

 

EAI und EDI in der Cloud ,
windows.developer

Weitere Infos

 

Verteilt und doch ein Ganzes: Verteilte Systeme mit AppFabric Applications,
dot.net magazin

Weitere Infos

 

Vorschau auf Neuerungen der kommenden WCF-Version,
dot.net magazin

Weitere Infos

 

Windows Azure Tutorial, Teil 3: Verbindung zwischen Cloud- und lokalen Applikationen,
iX - Magazin für professionelle Informationstechnik

Weitere Infos

 

MVC, die dritte: ASP.NET MVC 3 RC 2,
dot.net magazin

Weitere Infos

 

Leichtgewichtiges O/R-Mapping - Code Only mit Entitiy Framework CTP 5,
dot.net magazin

Weitere Infos

 

Weitere Artikel

Training & Beratung

Gemeinsam mit meinen Kollegen aus dem IT-Visions Netzwerk unterstützte ich durch zielgerichtete Inhouse-Schulungen und Beratung Unternehmen bei der Planung und Umsetzung von großer Software-Systeme.

Mehr lesen

In Kontakt treten

 
Konferenzen

BASTA! on Tour von 4/25/2012 bis 4/27/2012 in Düsseldorf

Meine Talks

Web-Site der Konferenz

 

BASTA! Spring 2012 von 2/27/2012 bis 3/2/2012 in Darmstadt

Meine Talks

Web-Site der Konferenz

 

ADC - Advanced Developers Conference von 10/26/2011 bis 10/27/2011 in Frankental (Deutschland)

Meine Talks

Web-Site der Konferenz

 

Scandev on tour von 10/18/2011 bis 10/18/2011 in Stockholm (Schweden)

Meine Talks

Web-Site der Konferenz

 

BASTA 2011 von 9/26/2011 bis 9/30/2011 in Mainz

Meine Talks

Web-Site der Konferenz

 

Jazoon - International Conference on the modern art of software von 6/21/2011 bis 6/23/2011 in Zürich

Meine Talks

Web-Site der Konferenz

 

Scandinavian Developer Conference 2011 von 4/4/2011 bis 4/5/2011 in Göteborg (Schweden)

Meine Talks

Web-Site der Konferenz

 

SOA-Days von 3/30/2011 bis 3/31/2011 in Bonn

Meine Talks

Web-Site der Konferenz

 
Weitere Konferenzen
von Manfred, 22. September 2011 23:37
Die Möglichkeit des Url-Mappings bringt in ASP.NET einige nette Möglichkeiten mit sich. Macht man davon jedoch, zum Beispiel im Zuge der Implementierung von REST-Services, intensiv Gebrauch, wirkt die Tatsache, dass das Mapping nicht im Rahmen der Action-Methoden sondern Global.asax zu hinterlegen ist, nervig. Aus diesem Grund habe ich mich diese Woche an der Implementierung eines UrlMapping-Attributes versucht. Dieses wird wie nachfolgend dargestellt verwendet:
public class FlugRessourceController : Controller
{

    [UrlMapping("/fluege/{flugId}/buchungen")]
    public ActionResult Buchungen(int flugId)
    {
        var rep = new Repository();
        var fluege = rep.FindBuchungenByFlugId(flugId);
        return Json(fluege, JsonRequestBehavior.AllowGet);
    }
}
Das Attribut an sich gestaltet sich relative einfach. 
public class UrlMappingAttribute: Attribute
{
    public UrlMappingAttribute(string url)
    {
        Url = url;
    }
 
    public String Url { get; set; }
 
}
Um es „zum Leben zu erwecken“, habe ich die nachfolgend dargestellte Erweiterungsmethode MapController<T> entwickelt. Sie nimmt den Typ eines Controllers als Typ-Parameter entgegen und erstellt dafür anhand der in den UrlMapping-Attributen enthaltenen Informationen Routen.
public static class UrlMappingRouteCollectionTools
{
    public static void MapController<T>(this RouteCollection routes) where T : IController
    {
        var controller = typeof(T);
        var methods = controller.GetMethods();
        int i = 0;
        foreach (var method in methods)
        {
            Debug.WriteLine(method.Name);
 
            var attribute = method.GetCustomAttributes(inherit: false)
                                    .Where(a => a is UrlMappingAttribute)
                                    .FirstOrDefault();
 
            if (attribute == null) continue;
 
            var urlMappingAttribute = attribute as UrlMappingAttribute;
 
            var controllerName = RemovePostfix(controller.Name, "Controller");
            var url = RemovePrefix(urlMappingAttribute.Url, "/");
            var routeName = CreateRouteName<T>(method, ++i);
            var actionName = method.Name;
 
            routes.MapRoute(
                routeName,
                url,
                new { controller = controllerName, action = actionName }
            );
        }
    }
 
    private static string RemovePostfix(string str, string postfix)
    {
        if (str.EndsWith(postfix)) {
            str = str.Substring(0, str.Length - postfix.Length);
        }
        return str;
    }
 
    private static string RemovePrefix(string str, string prefix)
    {
        if (str.StartsWith(prefix))
        {
            str = str.Substring(prefix.Length, str.Length - prefix.Length);
        }
        return str;
    }
 
    private static string CreateRouteName<T>(System.Reflection.MethodInfo m, int number) where T : IController
    {
        return typeof(T).Name + "_" + m.Name + "_autogenerated_" + number;
    }
}
Diese Methode kann man nun in der Global.asax in der Methode RegisterRoutes aufrufen und schon kommt man in den Genuss der über die Attribute definierten Routen.
public static void RegisterRoutes(RouteCollection routes)
{
 
    routes.MapController<FlugRessourceController>();
        […]
}

Kategorien: .Net 4 | ASP.NET