在下面的代码我等待到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风格的服务器即本地主机的电话:8080 /人/ 1将推出getPersonHandler(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);
}
如果你正在使用.NET 4.0或更高版本,并寻找可以插入(这听起来像你是)一个预先存在的REST服务器解决方案,您可能要检查出葡萄 。 你可以使用的NuGet得到它,和项目wiki有大量的示例代码。 此外,它是开源的,所以如果你只是想看看它如何完成,你可以在那里看到所有的源代码。
您可以过滤通过路径信息(使用正则表达式),并请求方法(GET,POST等)的请求。
我是这个项目的作者,我有一个需求,因为你描述的相似。 使用我发现这里和其他地方的资源,我建立了葡萄,这样我就在我的后面口袋的解决方案,每当我再次(需要它DRY )。