いつも通り、APIを作り、Chromeからリクエストしたところ、今まで普通にリクエストができていたのに、突然CORSで怒られるようになったので、調べてみた。
発生事象
ChromeではCORS、Edgeでは404が返ってきた。
Chrome
Access to XMLHttpRequest at 'https://localhost:44342/api/{長いため以下略}' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
その他の検索メソッドなどは普通に動いている&クエリを減らせばリクエストが通るため、クエリに何らかの問題があるのではないかとにらんだ。
原因
結論から言いますと、Getのクエリ文字列が長すぎる場合に、.NETでは404.15というものを返しているということが分かった。
404の先入観から、これは想定外だった。
公式ドキュメントにもそう記載があった。
404.15 - クエリ文字列が長すぎます。
どうやらクエリは2048バイトまでらしい。
https://docs.microsoft.com/en-us/aspnet/whitepapers/aspnet4/overview#0.2__Toc253429244
https://docs.microsoft.com/ja-jp/dotnet/api/system.web.configuration.httpruntimesection.maxquerystringlength?view=netframework-4.8
対処法
ググってみると、web.configに設定を記載すればよいとのこと。
しかし、.NET Coreの場合はweb.configがないのですが、作ってあげれば読み込んでくれるようです。
プロジェクト直下にweb.configファイルを作成し、以下の設定をします。
maxQueryString
パラメータを増やしてあげればOKです。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxQueryString="10000" />
</requestFiltering>
</security>
</system.webServer>
</location>
</configuration>
<!--ProjectGuid: {略}-->
これで再実行すると、長いクエリ文字列でも受け付けてくれ、ChromeでCORSが出なくなりました。