gpt4 book ai didi

c# - 使用 C# HttpListener 进行 URL 映射

转载 作者:可可西里 更新时间:2023-11-01 03:07:52 26 4
gpt4 key购买 nike

在下面的代码中,我正在等待对 8080 端口的任何调用。

public 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 将启动 getPersonH​​andler(int)

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

Mapping 语法只是我对我所知道的 JAX-RS 库的一厢情愿的类比。我想在 C#(桌面 C#,而不是 asp)中做同样的事情。

最佳答案

不用属性也能得到类似的效果

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);
}

关于c# - 使用 C# HttpListener 进行 URL 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10017564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com