eme*_*esx 16 c# http url-mapping
在下面的代码中,我正在等待对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();
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以将特定的URL模式映射到不同的行为?我想实现一个REST风格的服务器,即调用localhost:8080/person/1将启动getPersonHandler(int)
[Mapping("*:8080/person/$id")]
public void getPersonHandler(int id){...}
Run Code Online (Sandbox Code Playgroud)
Mapping我知道,语法只是我对JAX-RS库的一厢情愿.我想在C#中做同样的事情(桌面C#,而不是asp)
L.B*_*L.B 18
没有属性,您可以获得类似的效果
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);
});
Run Code Online (Sandbox Code Playgroud)
用法是:
http://localhost:8080/getPersonHandler/333
Run Code Online (Sandbox Code Playgroud)
如果你真的想使用属性那么
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);
});
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用as 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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28071 次 |
| 最近记录: |