Mappage d’URL avec C # HttpListener

Dans le code ci-dessous, j’attends tout appel sur le port 8080.

static void Main() { HttpListener listener = new HttpListener(); listener.Prefixes.Add("http://*:8080/"); listener.Start(); while(isRunning) { HttpListenerContext ctx = listener.GetContext(); new Thread(new Worker(ctx).ProcessRequest).Start(); } } 

Est-il possible de mapper des modèles d’URL spécifiques sur différents comportements? Je souhaite obtenir un serveur de style REST, c’est-à-dire un appel à localhost: 8080 / person / 1 va lancer getPersonHandler (int)

 [Mapping("*:8080/person/$id")] public void getPersonHandler(int id){...} 

La syntaxe de Mapping est juste ma propre analogie avec les bibliothèques JAX-RS que je connais. J’aimerais faire la même chose en C # (C # de bureau, pas asp)

Vous pouvez obtenir un effet similaire sans atsortingbuts

 HttpListener listener = new HttpListener(); listener.Prefixes.Add("http://*:8080/"); listener.Start(); while (true) { HttpListenerContext ctx = listener.GetContext(); ThreadPool.QueueUserWorkItem((_) => { ssortingng methodName = ctx.Request.Url.Segments[1].Replace("/", ""); ssortingng[] strParams = ctx.Request.Url .Segments .Skip(2) .Select(s=>s.Replace("/","")) .ToArray(); var method = this.GetType().GetMethod(methodName); object[] @params = method.GetParameters() .Select((p, i) => Convert.ChangeType(strParams[i], p.ParameterType)) .ToArray(); object ret = method.Invoke(this, @params); ssortingng retstr = JsonConvert.SerializeObject(ret); }); 

L’utilisation serait:

 http://localhost:8080/getPersonHandler/333 

si vous voulez vraiment utiliser les atsortingbuts alors

 HttpListener listener = new HttpListener(); listener.Prefixes.Add("http://*:8080/"); listener.Start(); while (true) { HttpListenerContext ctx = listener.GetContext(); ThreadPool.QueueUserWorkItem((_) => { ssortingng methodName = ctx.Request.Url.Segments[1].Replace("/", ""); ssortingng[] strParams = ctx.Request.Url .Segments .Skip(2) .Select(s=>s.Replace("/","")) .ToArray(); var method = this.GetType() .GetMethods() .Where(mi => mi.GetCustomAtsortingbutes(true).Any(attr => attr is Mapping && ((Mapping)attr).Map == methodName)) .First(); object[] @params = method.GetParameters() .Select((p, i) => Convert.ChangeType(strParams[i], p.ParameterType)) .ToArray(); object ret = method.Invoke(this, @params); ssortingng retstr = JsonConvert.SerializeObject(ret); }); } 

Ensuite, vous pouvez utiliser comme http://localhost:8080/Person/333 et vos définitions seraient

 class Mapping : Atsortingbute { public ssortingng Map; public Mapping(ssortingng s) { Map = s; } } [Mapping("Person")] public void getPersonHandler(int id) { Console.WriteLine("<<<<" + id); } 

Si vous travaillez dans .NET 4.0 ou version ultérieure et recherchez une solution de serveur REST préexistante que vous pouvez connecter (ce qui semble être le cas), vous pouvez consulter Grapevine . Vous pouvez l’obtenir en utilisant NuGet, et le wiki du projet contient de nombreux exemples de code. De plus, il est open source, donc si vous voulez voir comment cela peut être accompli, vous pouvez voir tout le code source.

Vous pouvez filtrer les demandes par informations de chemin (à l’aide d’expressions régulières) et par méthodes de demande (GET, POST, etc.).

Je suis l’auteur du projet et j’avais un besoin similaire à celui que vous avez décrit. En utilisant les ressources que j’ai trouvées ici et ailleurs, j’ai construit Grapevine afin d’avoir une solution dans ma poche arrière chaque fois que j’en avais besoin de nouveau ( DRY ).