gpt4 book ai didi

asp.net-mvc - Controller Action 多次击中-在Azure模拟器中运行的ASP.NET MVC 4应用

转载 作者:行者123 更新时间:2023-12-04 12:55:19 25 4
gpt4 key购买 nike

这可能需要一些时间来解释,但是我在这里:)。

我创建了两个Visual Studio 2012项目:

  • 在Visual Studio的“添加项目”对话框中使用(Web-> ASP.NET MVC 4 Web应用程序)模板的项目。我没有添加单元测试项目。
  • 使用Azure云服务模板(云-> Windows Azure云服务)的项目。我添加了一个角色,即ASP.NET MVC 4 Web角色,再次没有添加单元测试项目。

  • 与Visual Studio为我创建它们的方式一样,我完全不动这两个项目。

    对于每个项目,然后进入 HomeController类,并在 AboutContact每个操作方法(仅返回 View 的无聊操作)中设置一个断点。例如,我在方法的唯一一行上设置了一个断点:
    public ActionResult About()
    {
    return View();
    }

    然后,我开始调试第一个项目(非Azure项目)。一切都按预期进行-即,当我使用浏览器在“关于”和“联系”页面之间导航时,相应 Action 方法中的断点将在每次请求时被命中一次。在我看来还不错。

    然后,我开始调试Azure项目。我遵循在“关于”和“联系”页面之间导航的相同过程。这次,我发现了有趣的不确定性行为。在某些请求下,将在呈现页面之前多次击中action方法中的断点(有时超过两次)。有时,请求只会挂起,页面无法呈现(即使经过几分钟的等待)。

    我想知道为什么会这样,因为它正在影响我们正在处理的另一个Azure MVC应用程序中的更复杂的事情(例如,由于此问题,该应用程序可能会尝试在其中创建两个或多个模型对象实例我的数据库的一个请求)。

    我处于以下环境中:
  • Windows 8专业版(x64)
  • Visual Studio 2012最终版
  • 用于Visual Studio 2012的Windows Azure SDK
  • IIS 8 Express
  • 带有Firebug的Firefox浏览器(也使用IE确认了此行为)
  • SQL Server 2012(我猜不是很相关)

  • 我注意到的唯一有趣的事情是,每当调试Azure项目时,Visual Studio的“输出”窗口中都会出现以下警告消息:

    Remapping private port 80 to 81 in role 'My_Web_Role_Name' to avoid conflict during emulation.



    也许这种重新映射与此有关。再一次,在执行了 netstat -ano之后,我看到Azure Development Fabric进程正在监听端口80,所以也许这就是为什么它需要进行重新映射的原因……听起来很公平。

    无论如何,我希望有人可能对导致此行为的原因有所了解。这是我尝试过的一些要点和方法:
  • 重置IIS,重新启动Azure计算/存储模拟器,重新启动整个计算机
  • 剥离所有脚本的 View (即,如果页面上只有基本的HTML段落,行为仍然存在)
  • 我试图找到相关的IIS Express日志文件,但是Azure项目似乎不像其他项目那样通过IIS Express运行(是吗?)。
  • 我监视了Azure Compute Emulator控制台...那里没什么有趣的。

  • 所以...最后,一些问题:
  • 其他任何人都可以重现此行为吗?
  • Azure模拟器生成的其他日志是否可能对我有所帮助?

  • 我真的很感激在这里朝着正确的方向发展:)。

    干杯!

    编辑

    这是更多信息(我将继续调试此问题,因此我正在更新此问题):

    我决定在不调试的情况下运行该解决方案,并在 AboutContact操作方法中放入了一些简单的调试消息,例如:
    public ActionResult About()
    {
    System.IO.File.AppendAllText(@"c:\Logs\azure.log", DateTime.Now + ": Contact, thread " + System.Threading.Thread.CurrentThread.ManagedThreadId + "\r\n");
    return View();
    }

    我将 Tail附加到此文件,还启动了 Fiddler以查看HTTP上发生了什么。再次在两个 AboutContact链接之间导航,我看到了以下输出:

    从尾部:
  • ...
  • 2012/9/12下午:关于,主题7
  • 2012/9/12下午:Contact,thread 7
  • 2012/9/12下午:关于,主题7
  • 2012/9/12下午:Contact,thread 7
  • 2012/9/12下午:关于,线程6
  • 2012/9/12下午:Contact,thread 8
  • 2012/9/12下午:联系人,线程7
  • 2012/9/12下午:Contact,thread 7
  • 2012/9/12下午:关于,主题7
  • 2012/9/12下午:Contact,thread 8
  • 2012/9/12下午:关于,主题6
  • 2012/9/12下午:关于,线程14
  • 2012/9/12下午:关于,主题6
  • 2012/9/12下午:Contact,thread 7
  • 2012/9/12下午:关于,线程14
  • ...
  • 2012/9/12下午:Contact,thread 12
  • 2012/9/12下午:关于,线程12
  • 2012/9/12下午:关于,线程5
  • ...

  • 对于相同的请求,来自Fiddler(请注意,我也一直在尝试角色端点设置,但无济于事):

    所以...这里带回家的消息是:
  • HTTP流量似乎正常(Fiddler未显示任何重复请求)
  • 有时针对同一请求调用 Action 方法两次或三次,看似不确定(即上述原始问题)。
  • 在我的情况下,有趣的是,似乎恰好在 19s过去之前, Action 方法发生了另一个“击中”(即,当多次击中 Action 方法时,命中之间的时间差是确定的)
  • 每当操作方法被多次击中时,每次击中的线程ID通常是不同的

  • 我将继续进行更深入的研究……也许有人会基于此更新信息来提出一个建议:)。

    编辑2
    我决定在每种情况下都将方法ID和线程ID一起打印出来。对于每个请求,进程ID都是与IIS Express Worker进程相对应的ID。因此,似乎IIS Express工作进程有时会产生多个线程来处理请求,每个线程之间相距19s。

    ...而且我走得更深... :)

    编辑3

    我想我已经越来越接近这个问题了……我看了一下IIS Express托盘,并在启动应用程序后(未进行调试)看到了以下内容:

    我决定直接使用此URL(而不是上面的Fiddler中所示的127.0.0.2:8888),问题似乎消失了。现在这开始变得有意义了……如果我直接通过端口8889调用IIS应用程序,则一切都可以像使用原始非Azure项目那样正常工作。如果我通过端口8888调用Web角色(即Azure特定的部分),有时似乎会多次调用IIS应用程序。

    因此,我现在开始将精力集中在网络角色上。我将尝试看看是否可以找到一些相关的Web角色日志...

    编辑4

    我确保在应用程序上使用 diagnostics was set up properly并在 Debug模式下运行它。然后,我转到Azure Compute Emulator UI,右键单击我的Web角色实例,然后选择“打开本地存储”。这将我带到资源管理器,在那里我能够找到一个子文件夹“temp\temp\RoleTemp\iisexpress”,其中包含一个日志文件,其内容如下所示(请注意,我已将端点更改回端口80 ,因此IIS Express应用程序现在又回到了端口81上):
  • 请求开始:“GET” 127.0.0.1:81/Home/关于
  • 请求已结束:127.0.0.1:81/Home/About,HTTP状态为200.0
  • 请求开始:“GET” 127.0.0.1:81/Home/联系
  • 请求已结束:127.0.0.1:81/Home/具有HTTP状态200.0的联系人
  • 请求开始:“GET” 127.0.0.1:81/Home/联系
  • 请求已结束:127.0.0.1:81/Home/具有HTTP状态200.0的联系人
  • 请求开始:“GET” 127.0.0.1:81/Home/联系
  • 请求已结束:127.0.0.1:81/Home/具有HTTP状态200.0的联系人
  • 请求开始:“GET” 127.0.0.1:81/Home/关于
  • 请求已结束:127.0.0.1:81/Home/About,HTTP状态为200.0
  • 请求开始:“GET” 127.0.0.1:81/Home/关于
  • 请求已结束:127.0.0.1:81/Home/About,HTTP状态为200.0
  • 请求开始:“GET” 127.0.0.1:81/Home/关于
  • 请求已结束:127.0.0.1:81/Home/About,HTTP状态为200.0
  • 请求开始:“GET” 127.0.0.1:81/Home/联系
  • 请求已结束:127.0.0.1:81/Home/具有HTTP状态200.0的联系人
  • 请求开始:“GET” 127.0.0.1:81/Home/联系
  • 请求已结束:127.0.0.1:81/Home/具有HTTP状态200.0的联系人
  • 请求开始:“GET” 127.0.0.1:81/Home/联系
  • 请求已结束:127.0.0.1:81/Home/具有HTTP状态200.0的联系人
  • 请求开始:“GET” 127.0.0.1:81/Home/关于
  • 请求已结束:127.0.0.1:81/Home/About,HTTP状态为200.0
  • 请求开始:“GET” 127.0.0.1:81/Home/联系
  • 请求已结束:127.0.0.1:81/Home/Contact with HTTP status 200.0

  • 同样,我只是在“关于”和“联系”页面之间切换,因此从日志中可以看到,单个Web角色终结点请求有时会导致Web角色多次调用IIS应用程序。现在,搜索一些更高级别的Web角色日志,以找出为什么这样做:)!

    最佳答案

    因此,根据我在原始帖子的各种修改中写的内容:

  • 至少在我的计算机上,DevFC.exe进程(开发结构,Azure计算模拟器)有时会从IIS Express产生多个对所请求资源的请求。也就是说,它将在仿真器终结点上接受单个请求,有时会一次又一次地向基础IIS Express应用程序生成多个请求,即使它们都成功发出HTTP状态代码200。这些生成的请求之间的时差似乎保持不变,但除此之外,该行为似乎是不确定的(即,并非对模拟器端点的每个请求都发生这种行为)。
  • 为了进行调试,我需要访问Azure计算仿真器的源代码,我猜我无法获得它。

  • 现在,我的理论(也是希望)是,这种行为某种程度上是我的开发环境所特有的,并且在真实的Azure基础结构上无法重现。也就是说,我想出了一种解决方法...

    我为Firefox创建了一个简单的代理文件,以将所有流向本地Azure仿真器端口的流量重定向到IIS Express应用程序端口。这解决了问题,但是我知道我现在基本上绕过了Azure模拟器,并且我猜测将来可能会遇到问题,因为我正在这样做(例如,如果我决定使用AppFabric缓存? )!

    同时,我将继续使用此变通方法进行开发,并定期部署到我的Azure登台环境中进行测试。

    无论如何,如果有人知道我将如何解决基本问题,请告诉我! :)

    编辑:
    我不再能够使用2.2版的Azure SDK工具重现该问题。如果您仍然看到此行为,请尝试升级!

    关于asp.net-mvc - Controller Action 多次击中-在Azure模拟器中运行的ASP.NET MVC 4应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13779410/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com