场景:我有一个在Visual Studio 2008中开发的ASP.NET MVC应用程序.有一个名为"Content"的根文件夹,用于存储图像和样式表.当我在本地运行(使用Cassini)并浏览我的应用程序时,始终会下载"Content"目录中的每个 资源.使用Firebug,我可以验证Web服务器返回HTTP 200("ok").
期望:我希望Cassini返回HTTP 304("未修改")而不是200.这是在IIS7下运行站点时的行为.
推理:我正在处理的网站有大量的静态资源(通常每页多达40个).在IIS7上浏览网站的速度非常快,因为浏览器会(正确)缓存这些资源.但是,浏览本地计算机上的站点非常缓慢.
在IIS7上以1秒以下呈现的页面需要30秒才能在Cassini上呈现.实际上,我每隔几分钟上传整个网站并从那里进行测试实际上更快.(是的,我认识到这是不正常和疯狂的.)
那么:我如何指导/欺骗Cassini像IIS7那样处理"内容"目录呢?
我已经针对我的Entity Framework支持的MVC 3站点设置了mvc-mini-profiler.一切都是适当的配置; 在Application_Start中开始分析,在Application_End中结束它,依此类推.分析部分工作得很好.
但是,当我尝试将我的数据模型对象生成交换为提供可分发的版本时,性能会变慢.不是每个SQL查询,但有些查询占用整个页面加载量的大约5倍.(启动IIS Express后第一页加载需要更长时间,但这是持续的.)
可忽略不计的时间(~2ms tops)用于查询,执行和"数据读取"SQL,而这一行:
var person = dataContext.People.FirstOrDefault(p => p.PersonID == id);
Run Code Online (Sandbox Code Playgroud)
...当被包裹时using(profiler.Step())
记录为300-400毫秒.我用dotTrace进行了分析,确认时间实际上是照常用于EF(可用的组件确实非常短暂地出现),只是需要更长的时间.
这使我相信连接或其某些组成部分缺少足够的数据,使EF表现更差.
这就是我用来制作上下文对象的东西(我的edmx模型的类叫做DataContext):
var conn = ProfiledDbConnection.Get(
/* returns an SqlConnection */CreateConnection());
return CreateObjectContext<DataContext>(conn);
Run Code Online (Sandbox Code Playgroud)
我最初使用的是mvc-mini-profiler提供的ObjectContextUtils.CreateObjectContext
方法.我深入研究它并注意到它设置了一个通配符元数据工作空间路径字符串.由于我将数据库层隔离到一个项目,而将几个MVC站点作为使用代码的其他项目隔离,因此这些路径已经改变,我宁愿更具体.另外,我认为这是性能问题的原因.我将CreateObjectContext
功能复制到我自己的项目中以提供此功能,如下所示:
public static T CreateObjectContext<T>(DbConnection connection) where T : System.Data.Objects.ObjectContext {
var workspace = new System.Data.Metadata.Edm.MetadataWorkspace(
GetMetadataPathsString().Split('|'),
// ^-- returns
// "res://*/Redacted.csdl|res://*/Redacted.ssdl|res://*/Redacted.msl"
new Assembly[] { typeof(T).Assembly });
// The remainder of the method is copied straight from the original,
// and I carried over …
Run Code Online (Sandbox Code Playgroud)