MVC应用程序不能在服务器上运行,但在开发机器上运行良好

问题描述:

我能够在我的开发机器上运行我的应用程序,但只要我将它发布到Web服务器,一些功能就会丢失。任何类型的.ajax POST通常不会有401未经授权的错误。MVC应用程序不能在服务器上运行,但在开发机器上运行良好

服务器是Windows 2008与IIS7。我还在服务器上安装了MVC2的Visual Studio 2008,并直接在服务器上运行应用程序,并且相同的.ajax POST不起作用,但错误更改为500未知。

感谢您的帮助。

+1

如果您通过在浏览器中输入url来调用期望进行ajax调用的URL,您会得到什么? – 2010-04-14 20:07:10

如果你正在使用jQuery,你确定你正在请求与你的应用程序位于同一个域的数据吗?如果不存在这个jQuery Forum post:

+0

是的,他们都在同一个域名。 – 2010-04-14 17:45:06

的解决方法,我认为你需要一个自定义的ASP.NET MVC授权属性对于Ajax请求

public class CustomAuthorizeAttribute : AuthorizeAttribute 
    { 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      base.OnAuthorization(filterContext); 
      if (filterContext.Result == null || (filterContext.Result.GetType() != typeof(HttpUnauthorizedResult) 
       || !filterContext.HttpContext.Request.IsAjaxRequest())) 
       return; 

      var redirectToUrl = "/login?returnUrl=" + filterContext.HttpContext.Request.UrlReferrer.PathAndQuery; 

      filterContext.Result = filterContext.HttpContext.Request.ContentType == "application/json" 
       ? (ActionResult) 
       new JsonResult 
       { 
        Data = new { RedirectTo = redirectToUrl }, 
        ContentEncoding = System.Text.Encoding.UTF8, 
        JsonRequestBehavior = JsonRequestBehavior.DenyGet 
       } 
       : new ContentResult 
       { 
        Content = redirectToUrl, 
        ContentEncoding = System.Text.Encoding.UTF8, 
        ContentType = "text/html" 
       }; 

      //Important: Cannot set 401 as asp.net intercepts and returns login page 
      //so instead set 530 User access denied    
      filterContext.HttpContext.Response.StatusCode = 530; //User Access Denied 
      filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;    
     } 
    } 
+0

谢谢你我在哪里放置这个类 – 2010-04-14 17:58:19

+0

如果你没有授权过滤器,你不需要为它们设置一个特殊的Ajax过滤器。您是否使用授权过滤器来装饰控制器或动作? – 2010-04-14 20:09:23

我曾经有过这个问题。当您致电您的ajax服务时,请务必使用相关网址。

www.mysite.com/myservice 

一样

mysite.com/myservice 

www.mysite.com 

所以打电话时,调用该服务时,你应该用的是:

/myservice 

答:看起来我发现我的问题。

在我的控制器,我有以下方法:

[JsonFilter(Param = "course", JsonDataType = typeof(EmployeeSearchItem))] 
    public ActionResult ViewCourseByID(EmployeeSearchItem course) 
    { 

...}

而且EmployeeSearchItem是在自己的.cs文件中的类:

namespace EducationAssistanceMVC.Models 
{ 
public class EmployeeSearchItem //: Controller 
{ 
    public string empIDSearch { get; set; } 

... }

我的解决方案是在EmployeeSearchItem.cs文件中注释掉上述Controller的继承并且还注释掉任何Using指令。

哇,我不敢相信花了这么长时间才弄清楚。