82493
ASP .NET COREでAjaxによるデータの受け渡しを行うため、そのコードの組み方を調べております。  
そこで、下記のリンクのサンプルが非常に分かりやすかったため、ダウンロードしてサーバへデプロイしました。

<https://www.aspsnippets.com/Articles/Using-jQuery-AJAX-in-ASPNet-Core-Razor-
Pages.aspx>

LocalのIIS
Expressではボタンを押すことで、Index.cshtml内の"OnPostGetTime"メソッドが確実に実行され、正常にPostが実行されているのを確認できます。  
しかし、サーバ側のIIS8.5上にデプロイした場合、エラーが発生してPostがはじかれてしまうという問題が出てしまいます。

原因が分からず、サーバのIISでチェックすべき項目がありましたら、ご教授お願いしたいと思います。  
なお、サーバ側の設定ですが、.NET Core用のアプリケーションプールを作成し、.NET CLRバージョンも「マネージコード無し」になっております。

状況としては下記です。

  1. サーバ側の仕様：  
Windows 2012 R2  
IIS 8.5 + .NET CORE 2.1ランタイムを動作

  2. クライアント側の開発環境：  
Windows 10  
Visual studio 2017

  3. IIS Express上でAjaxは正常に動作し、クライアント⇒Localサーバ側へPostが確実に実行される。

  4. IIS 8.5上にデプロイすると、クライアント⇒サーバ側へのPostがはじかれ、下のような文字化けエラーが発生してしまう。

[![画像の説明をここに入力](https://i.stack.imgur.com/8Mjlc.jpg)](https://i.stack.imgur.com/8Mjlc.jpg)
CC BY-SA 4.0
2021-09-13T09:14:54.560
82462
2021-09-16T02:02:00.343
2021-09-13T09:20:14.837
40029
40029
question
c# ajax asp.net-core
IIS Expressでは問題ないが、サーバのIIS上でASP .NET COREでPostが実行できない。
コメント欄でのアドバイスありがとうございました。

url: "/Index?handler=GetTime" の部分の解釈がIISのバージョンによって異なることが分かりました。  
アプケーションのアドレスを `http://example.com/test/`
とした場合、各々のバージョンによってurlが下記のように解釈されてしまいます。

  * IIS Express  
`http://localhost:{ポート番号}/test/Index?handler=GetTime`

  * IIS 8.5 (server 2012R2)  
`http://example.com/Index?handler=GetTime`

  * IIS 10 (server 2016)  
`http://example.com/test/Index?handler=GetTime`

IIS8.5の場合、存在しないアドレスが指定されてしまうため、404エラーになるようです。IIS 10の場合は問題なく動きました。

対策としては下記のようにページのアドレスを追加することで解消できました。

```

    url: window.location.href + 'Index?handler=GetTime',
    
```
CC BY-SA 4.0
2021-09-14T23:32:26.413
82493
2021-09-15T00:01:15.513
2021-09-15T00:01:15.513
3060
40029
82462
answer
私もIIS8.5にて同じ現象を確認しました。  
列挙しておきます。  
ブラウザはChrome, firefox, Edgeいずれも同じ結果です。

  1. .net core2.1+IIS 8.5 ⇒ 問題あり
  2. .net core2.1+IIS 10 ⇒ 問題無し
  3. .NET5 + IIS8.5 ⇒ 問題無し

Postだけにかぎらず、ajaxにおいては、.net core
2.1はIISバージョンとの組み合わせで大きく挙動が変わります。サポートが終了していますし、今後は.NET5に入れ替えることをオススメします。
CC BY-SA 4.0
2021-09-15T11:14:15.393
82506
2021-09-15T11:14:15.393
48222
82462
answer
質問者さんの回答のコメントで以下のように書きましたが、画像などが無いと説得力がなさそうなので、回答欄で画像を含めて説明します。回答ではありませんが、回答欄でないと画像が貼れないようなのでご容赦ください。

> url: "/Index?handler=GetTime" で / で始まるのはサイトルート相対パス（絶対パスと言う人もいる）なので、jQuery
> ajax で要求をかける際にブラウザのアドレスバーに表示された url が例えば `https://example.com/xxx/yyy`
> であれば、jQuery ajax が要求する url は `https://example.com/Index?handler=GetTime`
> になるはずです。そこはサーバーは関係なく、クライアント側だけ（ブラウザとスクリプトの url の設定）の話だと思うのですが。

具体例を画像を貼って説明します。

ブラウザ上でのページの表示は以下のようになっています。アドレスバーの url に注目してください。

[![画像の説明をここに入力](https://i.stack.imgur.com/n1YLo.jpg)](https://i.stack.imgur.com/n1YLo.jpg)

このページには以下のような jQuery ajax のコードが含まれています。url: "/Ajax/Details"
とサイトルート相対パスになっているところに注目。

[![画像の説明をここに入力](https://i.stack.imgur.com/C4p6m.jpg)](https://i.stack.imgur.com/C4p6m.jpg)

button1 クリックで jQuery ajax による POST 要求をかけると `https://<ホスト名>/Ajax/Details`
で要求が出ていきます。

[![画像の説明をここに入力](https://i.stack.imgur.com/720dG.jpg)](https://i.stack.imgur.com/720dG.jpg)

質問者さんのケース `http://example.com/xxx/yyy` と url: "/Index?handler=GetTime" では IIS
8.5 での結果の `https://example.com/Index?handler=GetTime` になるはずで、IIS Express や IIS
10 のように要求 url に test が追加されるというのは不思議です。

なので、質問者さんの設定・デプロイのやり方の問題ではないかと思った次第です。自分は IIS 8.5 の環境が無くて試せてないので想像の域を出ないですが。
CC BY-SA 4.0
2021-09-16T02:02:00.343
82524
2021-09-16T02:02:00.343
43387
82462
answer