15

Вопрос по c#, http – Отображение URL с помощью C # HttpListener

В приведенном ниже коде я жду любого вызова на порт 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();
  }
}

Можно ли сопоставить конкретные шаблоны URL с различным поведением? Я хочу получить сервер в стиле REST, то есть вызовlocalhost:8080/person/1 запустит getPersonHandler (int)

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

Mapping синтаксис - это просто моя собственная желаемая аналогия с библиотеками JAX-RS, которую я знаю. Я хотел бы сделать то же самое в C # (рабочий стол C #, а не asp)

  • Error: User Rate Limit Exceeded

    от emesx
  • Error: User Rate Limit Exceededctx.Request.HttpMethod

    от
  • Error: User Rate Limit ExceededparamsError: User Rate Limit Exceeded@params

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded@Error: User Rate Limit Exceeded

    от emesx
  • Error: User Rate Limit Exceeded

    от emesx
  • Error: User Rate Limit Exceeded

    от dcstraw
  • Error: User Rate Limit Exceeded

    от Scott Offen
  • Error: User Rate Limit Exceeded

    от Sam Axe
  • Error: User Rate Limit Exceededasp.net/web-api/overview/hosting-aspnet-web-api/…

    от Ian Mercer
  • Error: User Rate Limit Exceeded

    от emesx
  • 5

    Error: User Rate Limit Exceeded

    ).

  • 17

    Error: User Rate Limit Exceeded

    HttpListener listener = new HttpListener();
    listener.Prefixes.Add("http://*:8080/");
    listener.Start();
    while (true)
    {
        HttpListenerContext ctx = listener.GetContext();
        ThreadPool.QueueUserWorkItem((_) =>
        {
            string methodName = ctx.Request.Url.Segments[1].Replace("/", "");
            string[] 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);
            string retstr = JsonConvert.SerializeObject(ret);
        });
    

    http://localhost:8080/getPersonHandler/333
    

    HttpListener listener = new HttpListener();
    listener.Prefixes.Add("http://*:8080/");
    listener.Start();
    while (true)
    {
        HttpListenerContext ctx = listener.GetContext();
        ThreadPool.QueueUserWorkItem((_) =>
        {
            string methodName = ctx.Request.Url.Segments[1].Replace("/", "");
            string[] strParams = ctx.Request.Url
                                    .Segments
                                    .Skip(2)
                                    .Select(s=>s.Replace("/",""))
                                    .ToArray();
    
            var method = this.GetType()
                                .GetMethods()
                                .Where(mi => mi.GetCustomAttributes(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);
            string retstr = JsonConvert.SerializeObject(ret);
        });
    }
    

    http://localhost:8080/Person/333

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