突然CORSで怒られたときの対処法(.NET Core)


いつも通り、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.

Edge

その他の検索メソッドなどは普通に動いている&クエリを減らせばリクエストが通るため、クエリに何らかの問題があるのではないかとにらんだ。

原因

結論から言いますと、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に設定を記載すればよいとのこと。

IIS7以降でURLクエリ文字列が長いと404エラー - ゆれくるコール開発日誌

しかし、.NET Coreの場合はweb.configがないのですが、作ってあげれば読み込んでくれるようです。

ASP.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が出なくなりました。