405方法不允许MVC 4 POST之前正在工作

时间:2017-10-14 15:10:59

标签: asp.net-mvc asp.net-mvc-4

我对客户网站有一个非常令人困惑的问题。我们开发了一个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#c​​ontroller:

[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附加到方法名称的末尾来重命名它们,现在它们可以工作。

为什么在控制器上重命名方法会使其工作?我怀疑一旦该方法出错并且它停止工作,那么我必须重命名该方法。关于在控制器中抛出异常的事情显然对你的方法名称是致命的。

1 个答案:

答案 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");
            }
        });
    }