我有一个真正令人困惑的客户网站的问题。我们开发了一个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附加到方法名称的末尾来重命名它们,现在它们可以工作。
为什么会重命名一个控制器上的方法,使工作?我怀疑,一旦方法出现错误并停止工作,那么我必须重命名该方法。显然,在控制器中抛出异常可能对您的方法名称是致命的。
如果你发布你有问题的代码的一些例子这将有助于。 –