111,097
社区成员




private HttpListener httpListener = new HttpListener();
public void Start(AsyncCallback callback)
{
httpListener.Start();
httpListener.BeginGetContext(endGetContext, callback);
}
private void endGetContext(IAsyncResult ar)
{
var callback = ar.AsyncState as AsyncCallback;
/*
* 下面创建了一个IAsyncResult
* 主要是为了把HttpListenerContext传递出去
*/
callback(ACTransfer.Create(new HttpContext(httpListener.EndGetContext(ar))));
if (httpListener != null)
{
httpListener.BeginGetContext(endGetContext, callback);//开始监听下一个
}
}
//从其他地方调用方法
.Start((ar) =>
{
var context = ar.AsyncState as HttpContext;
var request = context.Request;
using (var writer = new System.IO.StreamWriter(context.Response.OutputStream))
{
writer.Write("return: " + i++);//这个i只是测试用的一个全局变量
}
});
1.在这个匿名委托中加上断点,会停止两次
2.用浏览器直接访问,每次返回的值都是2的倍数
3.去掉黄色部分代码加断点就只停止一次
public void Start(Action<HttpListenerContext> callback)
{
httpListener.Start();
httpListener.BeginGetContext(endGetContext, callback);
}
开始接收并处理请求
HttpServer.Start((context) =>
{
var request = context.Request;//用来访问请求
//这里做些处理...
using (var writer = new System.IO.StreamWriter(context.Response.OutputStream))
{
writer.Write("response");//响应消息
}
});
我想请问的就是上面的代码会被执行两次是什么原因
private void endGetContext(IAsyncResult ar)
{
var callback = ar.AsyncState as Action<HttpListenerContext>;
var context = httpListener.EndGetContext(ar);
httpListener.BeginGetContext(endGetContext, callback);//开始监听下一个
callback(context);
}
但是,总之是先提高 I/O 效率,然后才 callback 业务处理。.Start((context) =>
{
using (var writer = new System.IO.StreamWriter(context.Response.OutputStream))
{
writer.Write("return: " + i++);//这个i只是测试用的一个全局变量
}
});
直接使用 HttpListenerContext 来输出。注意不是 HttpContext,而是 HttpListenerContext。private HttpListener httpListener = new HttpListener();
public void Start(Action<HttpListenerContext> callback)
{
httpListener.Start();
httpListener.BeginGetContext(endGetContext, callback);
}
private void endGetContext(IAsyncResult ar)
{
var callback = ar.AsyncState as Action<HttpListenerContext>;
httpListener.BeginGetContext(endGetContext, callback);//开始监听下一个
callback(httpListener.EndGetContext(ar));
}
就这么几句代码,让你写的“稀碎”。