我试图理解为什么我的示例项目中的 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
c# - NancyFx 自托管休息服务无法处理并行查询-LMLPHP
和调试输出:
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/

10-11 15:21
查看更多