2017-10-14 19 views
0

私はカスタマーサイトで本当に困った問題があります。私たちは、別のASP.netアプリケーションのサブディレクトリで実行されているC#MVC 4.0アプリケーションを開発しました。私たちは、JQueryからコントローラまで、多くのAjax呼び出しを使用しています。最近、POSTを実行しているときにコントローラ上の特定のメソッドが "405メソッドが許可されていません"という戻り値を返す問題がありました。このメソッドは、他にも数多くのAjaxメソッドと同じです。405メソッドが許可されていませんMVC 4 POSTが以前に動作していました

コードを提供するように編集:私は、Webアプリケーション全体をコピーして、ちょうど新しいサブディレクトリを作成し

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

は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#のコントローラ は、ここで問題のある機能です何が起こるか見るために。たとえば、現在のアプリケーションがmain \ Aディレクトリの下で実行されていて、クローンされたアプリケーションがmain \ Bで実行されているとします。メソッドGetCitiesThatStartWithはメイン\ Aの下で実行され、405を返しますが、main \ Bの下では同じメソッドが動作します。しかし、GetCitiesFromRegionと呼ばれる特定のメソッドがあり、常に両方で失敗します。その特定の方法が働いていました。

私はそれがコードの問題ではないと思っています。なぜ、1つは動作し、もう1つは動作しないからです。 IISのリセットも機能しません。私はコントローラにテストメソッドを追加し、テストAjaxページからそれらを呼び出すことができ、失敗することがあります。特定のメソッド名で失敗すると、もはやそれを動作させることができなくなります。 IISがメソッドが失敗し、エラーをキャッシュしていることをIISが記憶しているかのようになります。

更新

私は2つの問題を発見しました。 1つの問題は、コントローラのコンストラクタがその時点で認証されなかったために例外をスローしていたことです。私はその問題を解決しました。

他の問題は、私がGetCitiesThatStartWithと他のいくつかの方法を動作させることができなかったことです。メソッド名の最後にV2を追加して名前を変更しました。

なぜコントローラー上のメソッドの名前を変更すると機能するのですか?私はメソッドがエラーを取得し、それが動作を停止したら、メソッドの名前を変更する必要があると思う。コントローラに例外を投げることは、あなたのメソッド名にとっては致命的になる可能性があります。

+0

それはあなたのコードのいくつかの例を掲載場合は、との問題を持っていた役立つだろう。 –

答えて

1

私は、これはあなたを助けると思う: -

私はあなたがGetCitiesThatStartWithを使用しているので、それがGet要求にマッピングされますデフォルトで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

を取得するようリクエストします。ありがとうございます。私は、ルーティングの暗黙的な動詞の特徴について知らなかった。何人かの要求が投稿に取り組んでいた理由は、私に困惑しました。 –

関連する問題