2017-10-14 32 views
0

我有一个真正令人困惑的客户网站的问题。我们开发了一个C#MVC 4.0应用程序,该应用程序在另一个ASP.net应用程序的子目录中运行。我们使用从JQuery到控制器的大量Ajax调用。最近出现了一个问题,那就是控制器上的特定方法在执行POST时已经开始返回“405方法不允许”。这种方法与许多其他的Ajax方法没有区别。405方法不允许MVC 4 POST之前工作

编辑提供代码: 这里是有问题的功能:

的JavaScript:

function populateCitiesLike(cityTerm, fnInitialCityNames) { 
     var serviceBase = 'ProjectCities/'; 

     var cityData = { term: cityTerm }; 
     $.ajax({ 
      type: "POST", 
      data: JSON.stringify(cityData), 
      url: serviceBase + "GetCitiesThatStartWith/", 
      contentType: "application/json", 
      success: function (result) { 
       $("#cityCheckboxes").empty(); 
       if (result.length === 0) { 
        return; 
       } 
       addCityCheckboxes(result); 
       if (fnInitialCityNames != null) 
        fnInitialCityNames(); 
      }, 
      error: function() { 
       alert("We have an error"); 
      } 
     }); 
    } 

C#控制器:

[AjaxOnly,HttpPost] 
     public ActionResult GetCitiesThatStartWith(string term) 
     { 

      List<string> dbCities = null; 
      List<Cities> cityList = new List<Cities>(); 


      dbCities = _reposProject.GetCitiesThatStartWith(term); 
       cityList = GetJsonFormatForCityList(dbCities); 

      // return Json(result); 
      return Json(cityList, JsonRequestBehavior.AllowGet); 
     } 

我复制了整个Web应用程序并创建了一个新的子目录只看看会发生什么。因此,例如当前应用程序正在主\ A目录下运行,现在克隆的应用程序正在主\ B下运行。 GetCitiesThatStartWith方法在主\ A下运行,返回405,但主\ B下的方法工作正常。但是,有一个名为GetCitiesFromRegion的特定方法始终都失败。该特定方法用于工作。

我不认为这是一个代码问题,因为为什么会一个工作和其他不。重置IIS也不起作用。我可以将测试方法添加到控制器,并从测试Ajax页面调用它们,有时它们会失败,有时甚至不会。一旦他们以特定的方法名称失败,我不能再使它工作。这几乎就像IIS记得该方法失败并正在缓存该错误。

更新

花更多的时间与它,我已经发现了2个问题后。一个问题是控制器构造函数抛出一个异常,因为它在那个时候没有被认证。我已经解决了这个问题。

这是令人费解的另一个问题是,我不能让GetCitiesThatStartWith工作和其他一些方法。我通过将V2附加到方法名称的末尾来重命名它们,现在它们可以工作。

为什么会重命名一个控制器上的方法,使工作?我怀疑,一旦方法出现错误并停止工作,那么我必须重命名该方法。显然,在控制器中抛出异常可能对您的方法名称是致命的。

+0

如果你发布你有问题的代码的一些例子这将有助于。 –

回答

1

我认为这会帮助你: -

我已经在默认情况下它会与Get请求,因为你正在使用GetCitiesThatStartWith映射改变方法名CitiesThatStartWith

控制器代码

[AjaxOnly,HttpPost] 
     public ActionResult CitiesThatStartWith(string term) 
     { 

      List<string> dbCities = null; 
      List<Cities> cityList = new List<Cities>(); 


      dbCities = _reposProject.GetCitiesThatStartWith(term); 
       cityList = GetJsonFormatForCityList(dbCities); 

      // return Json(result); 
      return Json(cityList, JsonRequestBehavior.AllowGet); 
     } 

Javascript代码

function populateCitiesLike(cityTerm, fnInitialCityNames) { 
     var serviceBase = 'ProjectCities/'; 

     var cityData = { term: cityTerm }; 
     $.ajax({ 
      type: "POST", 
      data: JSON.stringify(cityData), 
      url: serviceBase + "CitiesThatStartWith/", 
      contentType: "application/json", 
      success: function (result) { 
       $("#cityCheckboxes").empty(); 
       if (result.length === 0) { 
        return; 
       } 
       addCityCheckboxes(result); 
       if (fnInitialCityNames != null) 
        fnInitialCityNames(); 
      }, 
      error: function() { 
       alert("We have an error"); 
      } 
     }); 
    } 
+0

是的,重命名是问题的一部分,但并没有告诉我为什么我需要重命名。 –

+0

如果您将您的方法命名为get,它将默认映射请求以获得 –

+0

是的,谢谢。我不知道路由的隐式动词功能。它确实让我困惑,为什么有些人要求在帖子上工作。 –