我试图理解为什么我的示例项目中的 nancyFx 无法处理并行查询。
我正在运行 Windows 8、VS2015、C#、fiddler 4。
这是我的示例服务:
class Program
{
static void Main(string[] args)
{
Listen();
}
static void Listen()
{
using (var host = new NancyHost(new Uri("http://localhost:4546")))
{
host.Start();
Console.ReadLine();
}
}
}
public class TestModule : NancyModule
{
public TestModule() : base("/")
{
Get["/"] = (param) =>
{
Debug.WriteLine("Start:" + DateTime.Now.TimeOfDay.ToString());
Thread.Sleep(100);
Debug.WriteLine("End:" + DateTime.Now.TimeOfDay.ToString());
return Response.AsText("Success");
};
}
}
这是示例查询:
GET http://localhost:4546/ HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: ru-RU
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: localhost:4546
Connection: Keep-Alive
我已经使用 fiddler 4 进行并行查询生成(重播功能)并测量查询运行时间。
当我运行一个查询时 - 处理时间约为 100 毫秒(0:00:00.104),
但是当我运行多个查询时 - 处理时间增长太多,这里是例子:
Fiddler parallel queries screenshot
和调试输出:
Start:09:56:32.8385200
Start:09:56:32.8443855
End:09:56:32.9396601
End:09:56:32.9455256
Start:09:56:32.9465022
End:09:56:33.0478691
Start:09:56:33.0478691
End:09:56:33.1498256
Start:09:56:33.1507976
End:09:56:33.2516390
Start:09:56:33.2535998
End:09:56:33.3554522
Start:09:56:33.3564277
End:09:56:33.4584340
Start:09:56:33.4594080
End:09:56:33.5608216
Start:09:56:33.5617992
End:09:56:33.6631615
Start:09:56:33.6641370
End:09:56:33.7649969
Start:09:56:33.7659714
End:09:56:33.8673301
Start:09:56:33.8683072
End:09:56:33.9696905
Start:09:56:33.9706676
End:09:56:34.0713212
Start:09:56:34.0722972
End:09:56:34.1729940
Start:09:56:34.1759211
End:09:56:34.2774876
正如我们在 fiddler 时间线中看到的那样 - 所有查询同时开始运行,但执行时间不同。
我们也可以用不同的负载和行为来替换 Thread.Sleep 仍然相同。
我们也可以用 RestSharp、HttpClient 替换 fiddler 来生成查询 - 行为仍然相同。
我们也可以用 ServiceStack.Server(也是自托管)替换 NancyFx - 行为仍然相同。
为什么? :) 我该如何解决?
UPD:
另外,根据@FireAlkazar 的猜测,我试图删除 Debug.WriteLine。
现在代码是:
Get["/"] = (param) => {
var response = Response.AsText("");
Thread.Sleep(100);
return response;
};
结果是一样的,这里是截图:here is it
最佳答案
你们有没有试过使方法异步? true 参数告诉 Nancy 作为异步运行,而 async 关键字告诉 VS 中的代码将返回一个 Task 或有一个 await 关键字...注意我没有测试过这段代码,因为我在一个有点复杂的方法,但它应该运行。
Get["/", true] = async (param, ct) => {
var response = Response.AsText("");
Thread.Sleep(100);
return Task.FromResult<string>(response);
};
关于c# - NancyFx 自托管休息服务无法处理并行查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33706005/