And*_*tan 11 c# visual-studio-2010 razor asp.net-mvc-3 asp.net-mvc-4
这里有很多阐述 - 但它是必要的.
不确定有多少人知道这一点,但是,Visual Studio中的Razor代码编辑器会导致您的网站在Application_Start
事件发生之前被"测试" - 这会导致我当前项目中出现一些恼人的问题, WebActivator做了很多网站初始化.
更新 - 仔细观察它不只是Razor - 它看起来像是Visual Studio范围内 - 因此标题的变化
我需要能够检测Visual Studio运行网站代码的时间,而不是网络服务器.
要演示 - 执行以下操作(完全按照书面形式确保其重现):
RazorPageBugTest
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MvcApplication6.App_Start;
using System.IO;
[assembly: WebActivator.PreApplicationStartMethod(
typeof(RazorPageBugTest), "Start", Order = 0)]
namespace MvcApplication6.App_Start
{
public static class RazorPageBugTest
{
public static void Start()
{
using (var writer = File.Open(@"c:\trace.txt", FileMode.Create))
{
using (var tw = new StreamWriter(writer))
{
tw.AutoFlush = true;
tw.WriteLine("Written at {0}", DateTime.Now);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,此代码通常不会在Web服务器上运行 - 因为它正在写入驱动器C :(如果您不以管理员身份运行VS,这可能无法在您的计算机上运行).
这就证明了这里的问题 - Razor代码编辑器正在启动AppDomain,并且有效地炮轰网站以获取智能感知(包括App_Helpers文件夹中的东西等).现在它实际上并没有触发该Application_Start
方法 - 但是当你在项目中也有WebActivator时,它的任何预应用程序启动方法都会被触发.
在我的情况下,这导致了巨大的问题 - 高CPU使用率和内存使用率devenv.exe
(相当于刚刚启动的网站)因为我初始化了DI容器而且天知道此时还有什么,但特别是一个证明非常烦人.
我的网站有一个组件,可以在网络上侦听来自Web场中其他计算机的状态和缓存失效消息.在QA和Live环境中,这个监听器永远不会打开端口并监听 - 在我的开发机器上,然而,它经常失败 - 说端口已经在使用中.当我寻找持有它的过程时 - 它始终是devenv.exe
.
你猜对了 - 我在一个WebActivator初始化的boot-strapping调用中启动了这个监听器.
所以问题是 - 有没有人知道一种方法来检测代码是不是由'正确'的web主机运行所以我可以阻止它运行?我对此特别抱有希望,因为这也意味着我的Visual Studio和Razor编辑体验将会更快地成为一个该死的网站!
作为奖励,任何修复都可以合法地发送给WebActivator的作者David Ebbo - 所以他可以在他的堆栈中更早地将其粘贴以防止问题完全发生!
更新
我刚刚在GitHub上的WebActivator页面上添加了一个问题,看看David Ebbo是否可以将我的修复程序或更好的修复程序推送到WebActivator组件中.
归档时间: |
|
查看次数: |
1025 次 |
最近记录: |