目标是在Azure MVC站点管理的同一URL上添加维护批处理。网址应该是这样的:
https://admin.mysite.com/Batch?pass=HKE671
我决定覆盖OnActionExecuting
并在网址中捕获我需要的信息以触发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
实际上只是在第一次测试时发送的。我第二次运行测试时不会发送它。这对我没有任何意义,因为每次都要检查会话。
今天的结论:它似乎更像是一个路由/重定向问题。
答案 0 :(得分: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只能在“?”之后获得该部分。从而使你的支票总是返回假。为什么这个IS在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。
答案 1 :(得分:0)
对我感到羞耻,问题出在其他地方!...上面的代码效果很好,但是这个网站的路由拒绝了一个不完整的网址。在这种情况下,它必须包含项目名称:https://admin.mysite.com/Admin/Batch?pass=HKE671
然后一切都恢复正常!
所以答案是:我的本地计算机上的行为是不同的,因为我的开发机器的本地主机不像Azure那样路由解决方案的项目。
非常感谢你的帮助!