Bạn có thể có được một hiệu ứng tương tự mà không thuộc tính
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);
});
Cách sử dụng sẽ là:
http://localhost:8080/getPersonHandler/333
nếu bạn thực sự muốn sử dụng Thuộc tính sau đó
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);
});
}
Sau đó, bạn có thể sử dụng làm http://localhost:8080/Person/333
và định nghĩa của bạn sẽ là
class Mapping : Attribute
{
public string Map;
public Mapping(string s)
{
Map = s;
}
}
[Mapping("Person")]
public void getPersonHandler(int id)
{
Console.WriteLine("<<<<" + id);
}
Nguồn
2012-04-04 19:29:55
Bạn có thực sự cần phải tái tạo lại bánh xe không? Web API trong ASP.NET MVC 4 có thể làm điều này. –
Tôi cần một ứng dụng độc lập. – emesx
API Web FYI ASP.NET có thể tự lưu trữ (không có IIS) – dcstraw