sam*_*y34 7 asp.net-mvc azure visual-studio-debugging asp.net-mvc-4
这可能需要一些时间来解释,但在这里我去:).
我创建了两个Visual Studio 2012项目:
我让这两个项目完全不受Visual Studio为我创建它们的方式的影响.
对于每个项目,我然后去了HomeController该类并在每个About和Contact动作方法中设置断点(仅返回视图的无聊动作).例如,我在方法的唯一一行设置了一个断点:
public ActionResult About()
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
然后我开始调试第一个项目(非Azure项目).一切都如预期的那样 - 即当我使用浏览器在"关于"和"联系"页面之间导航时,各个操作方法中的断点将在每个请求中被点击一次.对我来说很好.
然后我开始调试Azure项目.我遵循了在关于和联系页面之间导航的相同过程.这次我发现了有趣的非确定性行为.在某些请求中,在页面呈现之前,action方法中的断点将被多次(有时多于两次)命中.有时请求会挂起,页面也不会呈现(即使在等待几分钟后).
我想知道为什么会发生这种情况,因为它影响了我们正在处理的另一个Azure MVC应用程序中更复杂的事情(例如,由于这个问题,应用程序可能会尝试创建两个或更多模型对象的实例)我的数据库为一个请求).
我在以下环境中:
我注意到的唯一有趣的事情是,每当我调试Azure项目时,Visual Studio 的" 输出"窗口中都会出现以下警告消息:
在角色"My_Web_Role_Name"中重新映射私有端口80到81,以避免在仿真期间发生冲突.
也许这种重新映射与它有关.然后再说一遍,netstat -ano我看到Azure Development Fabric进程正在侦听端口80,所以也许这就是为什么它需要进行重映射...听起来很公平.
无论如何,我希望有人可能知道可能导致这种行为的原因.以下是我尝试过的一些额外点和方法:
所以...最后,一些问题:
我真的很感激在这里推进正确的方向:).
干杯!
编辑
这里有一些更多的信息(我正在更新这个问题,因为我继续调试这个问题):
我决定不运行调试解决方案,我把在双方的一些简单的调试信息About和Contact行动方法,例如:
public ActionResult About()
{
System.IO.File.AppendAllText(@"c:\Logs\azure.log", DateTime.Now + ": Contact, thread " + System.Threading.Thread.CurrentThread.ManagedThreadId + "\r\n");
return View();
}
Run Code Online (Sandbox Code Playgroud)
我将Tail附加到此文件,并启动Fiddler以查看HTTP上发生了什么.再次在两者About和Contact链接之间导航,我看到以下输出:
从尾巴:
来自Fiddler的相同请求(注意我也一直在玩我的角色端点设置,但无济于事):

所以...这里的带回家信息是:
我会继续深入挖掘...也许有人会很友好地根据这个更新的信息提供建议:).
编辑2 我决定在每种情况下打印出进程ID以及action方法中的线程ID.对于每个请求,进程ID都是与IIS Express Worker Process对应的进程ID.因此,似乎IIS Express工作进程有时会产生多个线程来处理请求,每个线程相隔19秒.
......我走得更深...... :)
编辑3
我想我正在接近这个问题......我看了一下IIS Express托盘并在启动应用程序后看到了以下内容(没有调试):

我决定直接使用这个URL(而不是如上面的Fiddler所示的127.0.0.2:8888),问题似乎消失了.这现在开始有意义......如果我直接通过端口8889调用IIS应用程序,一切正常,就像它对原始的非Azure项目一样.如果我通过端口8888调用Web角色(即特定于Azure的部分),它有时似乎多次调用IIS应用程序.
所以我现在开始缩小对网络角色的关注.我会试着看看我是否能找到一些相关的网络角色日志......
编辑4
我确保在应用程序上正确设置了诊断并在调试模式下运行它.然后,我转到Azure Compute Emulator UI,右键单击我的Web角色实例,然后选择"Open Local Store".这把我带到资源管理器,在那里我能够找到一个子文件夹"temp\temp\RoleTemp\iisexpress",里面有一个日志文件,内容看起来像这样(请注意我已将我的端点更改回端口80 ,因此IIS Express应用程序现在返回到端口81):
我只是在关于和联系页面之间切换,因此从日志中可以看到单个Web角色端点请求有时会导致Web角色多次调用IIS应用程序.现在要搜索一些更高级别的Web角色日志,以找出它为什么这样做:)!
因此,根据我在原始帖子的各种编辑中所写的内容:
现在,我的理论(和希望)是,这种行为在某种程度上特定于我的开发环境,并且不会在真正的 Azure 基础设施上重现。也就是说,我想出了一个解决方法......
我为 Firefox 创建了一个简单的代理文件,以将前往本地 Azure 模拟器端口的所有流量重定向到 IIS Express 应用程序端口。这解决了问题,但是我知道我现在基本上绕过了Azure模拟器,我猜我将来可能会遇到问题,因为我正在这样做(例如,如果我决定使用AppFabric缓存? )!
同时,我将继续使用此解决方法进行开发,并定期部署到我的 Azure 临时环境中进行测试。
无论如何,如果有人知道我如何解决根本问题,请告诉我!:)
编辑:我无法再使用 Azure SDK 工具 2.2 版重现该问题。如果您仍然看到此行为,请尝试升级!
| 归档时间: |
|
| 查看次数: |
4445 次 |
| 最近记录: |