7

添加 51Degrees 移动检测库后,我的 ASP.NET MVC 3 项目变得缓慢。<log logFile="~/bin/App_Data/51Log.txt" logLevel="Info" />该部分中定义的 51Degrees 日志文件<fiftyOne>显示,每次请求都会重新加载设备库,为每个请求添加 2-3 秒的延迟:

2011-10-22T14:17:34.9863774Z - 8436 - Info - Loaded 14691 devices using 11640 strings in 1882ms
2011-10-22T14:17:50.8442844Z - 8436 - Info - Loaded 14691 devices using 11640 strings in 1820ms
2011-10-22T14:17:57.2756523Z - 8436 - Info - Loaded 14691 devices using 11640 strings in 1928ms
2011-10-22T14:18:01.0488681Z - 8436 - Info - Loaded 14691 devices using 11640 strings in 1886ms
2011-10-22T14:18:04.6790757Z - 8436 - Info - Loaded 14691 devices using 11640 strings in 1862ms

此外,<fiftyOne> <log ... logLevel="Debug">web.config 中的设置在启动时会引发以下异常:

Storage scopes cannot be created when _AppStart is executing.

MVC 4 更新

如果我创建一个空白的 ASP.NET MVC 4 应用程序并添加最新的 51Degrees 2.0.3.2 NuGet 包,一切都会完美运行。正如预期的那样,日志反映二进制数据仅被加载一次,尽管有多个请求 (51Degrees.mobi-Lite-2012.01.05.dat)。

谨慎乐观,我将所有主要的 MVC 3 项目代码复制到一个新的 ASP.NET MVC 4 项目并重新添加了最新的 51Degrees 包,但问题再次出现。一定是与我的一个包不兼容,或者是一个奇怪的设置。

日志显示正在为每个请求重新加载库:

2012-01-18T11:50:02.5026920Z - 11928 - Info - Creating provider from binary data file '~\App_Data\51Degrees.mobi-Lite-2012.01.05.dat'.
2012-01-18T11:50:02.8137098Z - 11928 - Info - Created provider from binary data file '~\App_Data\51Degrees.mobi-Lite-2012.01.05.dat'.
2012-01-18T11:50:07.7419917Z - 11928 - Info - Creating provider from binary data file '~\App_Data\51Degrees.mobi-Lite-2012.01.05.dat'.
2012-01-18T11:50:08.0170074Z - 11928 - Info - Created provider from binary data file '~\App_Data\51Degrees.mobi-Lite-2012.01.05.dat'.
2012-01-18T11:50:10.4191448Z - 11928 - Info - Creating provider from binary data file '~\App_Data\51Degrees.mobi-Lite-2012.01.05.dat'.
2012-01-18T11:50:10.7251623Z - 11928 - Info - Created provider from binary data file '~\App_Data\51Degrees.mobi-Lite-2012.01.05.dat'.

延迟远小于 XML 数据文件(300 毫秒对 3000 毫秒),但它仍然会导致明显的延迟。

这两个项目的 51Degrees.mobi.config 文件是相同的,在我的 web.config 中,这是我加载的模块:

<modules>
    <remove name="Detector"/>
    <add name="Detector" type="FiftyOne.Foundation.Mobile.Detection.DetectorModule, FiftyOne.Foundation"/>
</modules>

什么可能导致 51Degrees 库在每个请求上重新加载?

4

2 回答 2

7

发生这种情况是因为日志文件位于 bin 文件夹中。每当 bin 文件夹中发生任何变化时,工作进程都会重新启动。将日志文件移动到 ~/App_Data 文件夹,您会发现问题将得到解决。感谢您使用51Degrees.mobi

于 2012-01-25T09:39:13.960 回答
0

我从CodePlex获取了 MVC3MobileDect 演示应用程序。我使用 ASP.NET Web 开发服务器和 IIS Express 运行它,并且都没有表现出您遇到的问题,即库会为每个对 Web 服务器的请求重新加载所有设备。

此外,演示项目没有包括对 Application_Start 中 BrowserCapabilitiesProvider 的修改(但是,即使我添加了它,它仍然有效)。

此时,假设您使用的是开源版本,我建议您获取 Foundation 程序集的源代码,并首先在

\Foundation\Mobile\Detection\Wurfl\Provider.cs(可能在InitWurflFiles方法中)。

也许调用堆栈中会有一些东西可以帮助您更好地了解正在发生的事情。

或者,将演示项目的配置与您的 Web 应用程序进行比较。

于 2011-11-28T21:00:24.693 回答