2

目标是在 Azure MVC 站点管理的相同 url 上添加维护批次。网址应该类似于:

https://admin.mysite.com/Batch?pass=HKE671

我决定OnActionExecuting在 url 中覆盖并捕获我需要的信息来触发该maintenance方法。我不熟悉 MVC 项目,这听起来可能不是很传统......

  protected override void OnActionExecuting(ActionExecutingContext filterContext)
  {
      EmailUtility.SendSupportEmail("DEBUG - On result executing", ""); //I receive this email
      int y = 14;
      if (Request.Url.Query.Length > y)
      {
          string url = Request.Url.Query.Remove(0, y); // I remove ?ReturnUrl=%2f
          if (url.StartsWith("Batch"))
          {
              mySite.Admin.Web.Controllers.TenantController controller = new mySite.Admin.Web.Controllers.TenantController();
              EmailUtility.SendSupportEmail("DEBUG - starts maintenance", ""); // I don't receive this one
              controller.maintenance(HttpUtility.ParseQueryString(url).Get("pass"));
          };
      }
      base.OnActionExecuting(filterContext);
  }

这段代码和我在本地需要的一样工作,该maintenance方法被调用并完成工作。但是在 Azure 上部署时,此修改会引发 404 错误。有趣的是,我发送了两封调试电子邮件:我没有收到第二封"DEBUG - starts maintenance",因此我的 404 错误来自OnActionExecuting.

首先,我想了解为什么我的开发机器和 Azure 之间的行为不同?

那么,我怎样才能让它工作呢?谢谢,

1 月 4 日编辑:
我取得了一些进展,但这个问题仍未解决。
- 关于我的开发机器和 Azure 之间的区别:这个站点上有一些重定向:https、404 和不存在的域。我认为这是由于 404 错误。用 try/catch 封装代码并没有给我发送任何错误,所以我猜我可以从假设中抑制 404。- 我在没有更多成功的情况下
尝试了上面的代码。 - 我注意到第一封电子邮件实际上只在第一次测试时发送。我第二次运行测试时没有发送它。这对我来说没有任何意义,因为每次都应该检查会话。OnAuthorization
DEBUG - On result executing

今天的结论:它似乎更像是一个路由/重定向问题。

4

2 回答 2

0

你为什么不这样做:

      protected override void OnActionExecuting(ActionExecutingContext filterContext)
      {    
         try {
            //your code here
         } catch (Exception ex){
            EmailUtility.SendSupportEmail("Execution failed: " + ex.Message , "");
         }
      }

如果您的代码抛出异常,这应该让您更好地理解它失败的原因。

但更重要的是,检查正确 URL 的一种更可靠的方法是:

if (filterContext.HttpContext.Request.Url.AbsolutePath.EndsWith("Batch")){
}

据我所知,您的字符串变量“url”永远不会以“Batch”开头,因为 Request.Url.Query 仅包含“?”之后的部分。从而使您的支票始终返回错误。为什么这在 localhost 上工作很难说,但在我看来它不应该。

实际上,要在所有情况下工作,您的检查应该是:

if (filterContext.HttpContext.Request.Url.AbsolutePath.ToLower().EndsWith("batch") || filterContext.HttpContext.Request.Url.AbsolutePath.ToLower().EndsWith("batch/")){
}

编辑后:好的,发生的情况是您在 Home Controller 中请求“Batch”操作,但由于您未经过身份验证,您被重定向到 Account Controller 中的 LogOn。您应该看到一个登录页面,除非您的 Views 文件夹中没有关联的 LogOn 视图,或者根本没有 AccountController,在这两种情况下都会引发异常。

Batch 方法是否应该检查身份验证?如果没有,请从 HomeController 中的此方法中删除 [Authorize] 注释,您应该没问题。

但是,您仍然需要调整 if-check,因为它实际上只在 LogOn 页面上评估为 true,如果您实际进入 Batch 页面,则为 false。

于 2016-02-01T16:29:28.183 回答
0

真可惜,问题出在其他地方!...上面的代码运行良好,但是该站点的路由拒绝了不完整的 url。在这种情况下,它必须包含项目名称:https://admin.mysite.com/Admin/Batch?pass=HKE671 然后一切恢复正常!

所以答案是:我的本地计算机上的行为是不同的,因为我的开发机器的本地主机不会像 Azure 那样路由解决方案的项目。

非常感谢您的帮助!

于 2016-02-06T06:30:10.253 回答