0

我有一个非常基本的 ASP.NET Web 服务。

它可以工作,但是第一次调用需要 10 秒 - 而后续调用会立即发生。

我意识到它是 JIT 编译的,因此我试图了解如何预编译事物以加快第一次调用。

到目前为止,这是我所做的。

网络服务文件是:HelloWorldService.cs

using System.Web.Services;
namespace MyService
{
  public class HelloWorldService: WebService
  {
    [WebMethod]
    public string HelloWorld()
    {
      return "Hello World";
    }
  }
}

我已经编译了这个使用gmcs -target:library HelloWorldService.cs -r:System.Web.Services

我已将生成的HelloWorldService.dll文件放在 webroot 的 /bin 目录中。

接下来,我创建了HelloWorld.asmx-stub 文件,如下所示:

<%@WebService Language="C#" Class="MyService.HelloWorldService"%>

这可行,但如前所述,第一次调用需要 10-15 秒才能完成......尽管后续调用工作正常。

在研究过程中,我看到了您需要使用该sgen实用程序来创建序列化 XML 文件的参考资料。

我通过运行使用了该文件:

sgen HelloWorldService.dll

它创建一个文件名HelloWorldService.XmlSerializers.dll并将其也放入/bin目录中。

然而,这些都没有帮助。

任何人都可以对此有所了解吗?

4

3 回答 3

4

通常,您要确保您的生产服务几乎永不停止。那么就没有“第一个”请求,因为只有在需要更改时才会重新编译。当您确实需要对生产进行更改(或重新启动服务器)时,您可以将其安排在低使用时间。如果没有可接受的低使用时间,您可以使用网络场,并在更新期间从场中删除服务器,并在更新期间向更新的服务器发出“第一个”请求,然后再将其返回场。

于 2013-03-10T01:45:02.827 回答
2

我已经使用 .Net 多年了,但我还没有找到任何东西来加速对 Web 服务或 Web 应用程序的第一次调用(另一方面,网站很棒,因为它们编译页面它们被称为一个接一个,这使事情变得更快)...

第一次调用总是编译所有内容,是的,这需要时间......但在那之后,如果你将 IIS 设置为不“在 X 时间后休眠应用程序池”,那很好。

我已经习惯自己做的是,每次我发布网站或网络服务时,我都会在浏览器中自己调用它,然后向相关人员发出“全部清除”消息......这样他们就可以获得即时服务从那时起。

于 2013-03-10T01:46:50.527 回答
1

我什至不知道它是否适用于 ASP.NET,但既然你用#mono 标记了这个问题,也许你应该看看这个(如果你还没有的话):http://www.mono- project.com/AOT

于 2013-03-10T04:11:25.000 回答