This problem has been mentioned in stackoverflow several dozen times, but I have a different problem.
Chrome first makes an OPTION call to get the headers. As you can see, there are correct headers.

For some reason, Chrome does not notice the title and cancels the actual request in the same way as if the title was not at all.

In fact, the page makes three calls and, oddly enough, one of them works.

So the question is, when does the title really exist, why does Chrome not respect it? What can I do to debug it?
Update
I tried adding Access-Control-Allow-Methods , so now the response of the OPTIONS call header includes these response headers:
Access-Control-Allow-Headers:Origin, X-Requested-With, Content-Type, Accept Access-Control-Allow-Methods:POST, GET, OPTIONS Access-Control-Allow-Origin:*
The result is the same.
Server side headers
I set headers on the server for each request (in Global.asax.cs Application_BeginRequest)
Response.Headers.Add("Access-Control-Allow-Origin", "*"); Response.Headers.Add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); Response.Headers.Add("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
After research with Fiddler
I looked at the raw request and response and found something surprising: the error is a simple HTTP 500 error from the application. Probably because the HTTP 500 error does not contain the correct headers, Chrome does not show the returned error, but instead indicates the error associated with the header.
Answer
So in conclusion, if Chrome gives the words No 'Access-Control-Allow-Origin' header , it can actually cover the HTTP 500 error. This can be determined by checking the request and response in Fiddler.