Приложение MVC не работает на сервере, но нормально работает на компьютере разработчика - PullRequest
1 голос
/ 14 апреля 2010

Я могу нормально запускать свое приложение на своем компьютере разработчика, но как только я публикую его на веб-сервере, некоторые функции теряются. Любой тип .ajax POST обычно не работает с 401 несанкционированной ошибкой.

Сервер Windows 2008 с IIS7. Я также установил Visual Studio 2008 с MVC2 на сервере и запустил приложение непосредственно на сервере, и тот же .ajax POST не работает, но ошибка изменилась до 500 неизвестных.

Спасибо за помощь.

Ответы [ 4 ]

2 голосов
/ 14 апреля 2010

Я думаю, что вам нужен пользовательский атрибут авторизации 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 голосов
/ 15 апреля 2010

Ответ: Похоже, я нашел свою проблему.

В моем контроллере у меня есть следующий метод:

 [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; }

...}

Мое решение состояло в том, чтобы закомментировать наследование Controller, указанное выше, в файле EmployeeSearchItem.cs, а также закомментировать любые директивы Using.

Ух ты, я не могу поверить, что потребовалось так много времени, чтобы понять это.

0 голосов
/ 15 апреля 2010

У меня была эта проблема однажды. Когда вы звоните в службу ajax, обязательно используйте относительные URL.

www.mysite.com/myservice

равно не так же, как

mysite.com/myservice

при звонке с

www.mysite.com

Итак, что вы должны использовать при вызове службы:

/myservice
0 голосов
/ 14 апреля 2010

если вы используете jquery, вы уверены, что запрашиваете данные, которые находятся в том же домене, что и ваше приложение? Если у вас нет обходных путей в этом jQuery сообщении на форуме:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...