2013-06-27 13 views
16

アムで同じ作品はAJAXはMVC 4を使用して示されているようJQUERY Ajax機能を利用してアム AJAX呼び出しは、IIS 7.5で404(ローカル)を返すが、他のIIS

Controller/FunctionName 



$.ajax({ 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     url: '/Controller/FunctionName', 
     . 
     . 
     . 
     )}; 

私のMVCアプリケーション

で私のコントローラへのコールを有します上記のコードでは、私はVisual studioから走っても、まったく問題なく動作します。

私はこれをサーバマシンにデポジットし、期待どおりにうまく動作します。 AJAX呼び出しで問題は見つかりませんでした。

は今私のローカルマシンでこれを展開しようとしています私のサーバーのバージョン(IIS 7.5)と同じですが、放火犯のすべてのAJAX呼び出しのため404取得していますをIIS。

私はビルドを確認しても、私は自分のウェブフォルダを指していて、何が間違っているのか探しています!

他のIISでも動作しますので、URL解決の問題は私の見解です。設定が不足しているか、これを修正するためのタイムリーなアイデアは素晴らしいだろう。

ありがとうございました

答えて

32

これは正常です。あなたのコントローラのアクションにURLをハードコードしているに:あなたはIISの仮想ディレクトリでアプリケーションを展開する場合

url: '/Controller/FunctionName', 

は正しいURLは次のようになります。あなたは絶対にハードコーディングしてはならない理由だ

url: '/YourAppName/Controller/FunctionName', 

ASP.NET MVCアプリケーション内のURLが、常にそれを生成するためのURLヘルパーを使用します。

url: '@Url.Action("FunctionName", "Controller")', 

と、このAJAX呼び出しがどこ別々のJavaScriptファイル内にある場合サーバー側のヘルパーを使用することはできません、あなたはAJAXifyingしているいくつかのDOM要素からこのURLを読むことができます。

たとえばあなたがアンカーを持っていたと仮定してみましょう:

@Html.ActionLink("click me", "FunctionName", "Controller", null, new { id = "myLink" }) 

、あなたがAJAXify:我々はヘルパーによって生成されたDOM要素からURLを読んでいるか

$('#myLink').click(function() { 
    $.ajax({ 
     url: this.href, 
     contentType: 'application/json; charset=utf-8', 
     type: 'GET', 
     . 
     . 
     . 
    )};  
    return false; 
}); 

注意してください。

結論と親指の2つのルール:NEVER EVER

  • ASP.NET内のURLを扱うときに絶対に常にASP.NET MVCアプリケーション
  • 使用のURLヘルパーをURLをハードコーディングMVCアプリケーション
+1

@ダーリンと完全に同意します。あるIISではどのように動作しますが、他のIISでは動作しませんか? – user2067567

+0

@ダリン同じ質問。それが他のIISで動作するのであれば、なぜ他のIISにはないのでしょうか? – Peru

+1

これは、アプリケーションがどのように構成されているかによって異なります。アプリケーションがWebサイトに直接展開されているのか、仮想ディレクトリとして展開されているのかに依存します。 –

0

私がIIS7.5のセットアップで見つけたのは、 'Handler Mapping'のリソースが 'OPTIONSVerbHandler'という名前のリソースが正しい順序で設定されていないということですceはUnknownとして戻る。

私はlocalhostアヤックスが、それは私にCORSの問題を与えてはならないことを、別の名前を持っている自分のネットワークサーバを呼んでいたが、それはやった、これは私の解決策だった私にとってこの作品。

開き、IISと左側のペインでサーバー名をクリックしてください。右ペインで、中央のペインの「Handler Mappings」をダブルクリックします。右側のウィンドウで、[View Ordered List]を選択します。 'OPTIONSVerbHandler'と 'svc-ISAPI-4.0_32bit'を見つけたら、 'OPTIONSVerbHandler'を 'svc-ISAPI-4.0_32bit'より上に移動してください。

は、あなたのAJAX呼び出し内部のあなたの「ハンドラが」それで「アクセス制御 - 許可 - 起源」を持っていないことを確認してください。

0

ビューのURLエンドポイントを格納するための隠しフィールドを使用し、「AJAX呼び出しを使用すると、サーバー側のヘルパーを使用することはできません、別のJavaScriptファイル内にある」場合というDarin's answerのジャスト補数:

@Html.Hidden("URLEndpointName", Url.Action("FunctionName", "Controller")) 

あなたのjsでその隠されたフィールドを読んでください:

url: $("#URLEndpointName").val(), 
関連する問題