我对客户网站有一个非常令人困惑的问题。我们开发了一个C#MVC 4.0应用程序,它运行在另一个ASP.net应用程序的子目录中。我们使用从JQuery到控制器的大量Ajax调用。最近出现了一个问题,即控制器上的特定方法在执行POST时开始返回“405方法不允许”。这种方法与许多其他很好的Ajax方法没什么不同。
编辑提供代码: 这是违规函数:
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#controller:
[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应用程序并创建了一个新的子目录,只是为了看看会发生什么。例如,当前应用程序在main \ A目录下运行,现在克隆的应用程序在main \ B下运行。方法GetCitiesThatStart在main \ A下运行,返回405但在main \ B下的方法相同。但是,有一种称为GetCitiesFromRegion的特定方法始终在两者上都失败。这个特殊的方法曾经起作用。
我不认为这是一个代码问题,因为为什么一个工作而另一个不工作。重置IIS也不起作用。我可以向控制器添加测试方法,并从测试Ajax页面调用它们,有时它们会失败,有时则不会。一旦他们以特定的方法名称失败,我就再也无法工作了。这几乎就像IIS记得该方法失败并缓存错误一样。
已更新
花了更多时间后,我发现了2个问题。一个问题是控制器构造函数抛出异常,因为它在那时未经过身份验证。我已经解决了这个问题。
另一个令人困惑的问题是我无法使用GetCitiesThatStartWith和其他一些方法。我通过将V2附加到方法名称的末尾来重命名它们,现在它们可以工作。
为什么在控制器上重命名方法会使其工作?我怀疑一旦该方法出错并且它停止工作,那么我必须重命名该方法。关于在控制器中抛出异常的事情显然对你的方法名称是致命的。
答案 0 :(得分:1)
我认为这会对你有所帮助: -
我已将方法名称更改为CitiesThatStartWith
,默认情况下会将其与Get
请求进行映射,因为您使用的是GetCitiesThatStartWith
。
控制器代码
[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");
}
});
}