Допустим ваш сайт, с именем CryptoAlertEmailConfirm.mizerov.com хочет обратиться за данными с помощью jQuery get к другому вашему сайту с именем CryptoAlert.mizerov.com вот таким образом

				
					    let pars = new URLSearchParams(window.location.search);
    if (pars.has('id')) {
        let id = pars.get('id');
        $.get("https://cryptoalert.mizerov.com/api/EmailConfirm/" + id,
            function (data) {
                var o = jQuery.parseJSON(data);
                $('#o1').html(o.id);
                $('#o2').html('Спасибо <b>' + o.Name + '</b>');
                $('#o3').html('Адрес: <b>' + o.Email + '</b> подтвержден.');
            }
        );
    }
				
			

Конечно браузер по умолчанию не может вам разрешить это сделать, он выдаст ошибку.

Access to XMLHttpRequest at ‘https://cryptoalert.mizerov.com/api/EmailConfirm/36’ from origin ‘https://cryptoalertemailconfirm.mizerov.com’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
jquery.min.js:2 GET https://cryptoalert.mizerov.com/api/EmailConfirm/36 net::ERR_FAILED

Что это значит? Все просто, нельзя обращаться к сайту из документа другого сайта. Как это исправить? Опять же, все просто.

1 – Идем в IIS, выбираем сайт, на который надо обратиться из другого вашего сайта и находим там кнопку – Заголовки ответов HTTP

2 – Открываем его и жмем Добавить

Сверху, в поле Имя пишем Access-Control-Allow-Origin, в поле Значение полное название второго сайта из документа которого хотите получать данные с помощью JavaScript.

Теперь все работает!

Кстати, данные мы тут получаем через ASP.Net Core Web API Service

				
					using am.BL;
using Microsoft.AspNetCore.Mvc;

namespace CryptoAlert.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class EmailConfirmController : ControllerBase
    {
        /// <summary>
        /// Поставить флаг IsConfirmed для Email юзера
        /// </summary>
        /// <param name="id">id</param>
        [HttpGet("{id}")]
        public string Get(int id)
        {
            string res, sql;
            sql = $"EmailConfirm {id}";
            res = G._S(G.db_select(sql));
            return res;
        }
    }
}

				
			

Данные приходят из хранимой процедуры EmailConfirm в виде Json строки, которую формирует sql

				
					alter proc EmailConfirm
	@user_id int
as
	update Users set IsConfirmed = 1 where id = @user_id
	select id, Name, Email from Users where id = @user_id
	for json auto, WITHOUT_ARRAY_WRAPPER
				
			

Что удивительно, сам SQL научился упаковывать результирующий DataSet в Json строку, с помощью такой вот дописки к запросу

for json auto, WITHOUT_ARRAY_WRAPPER

CORS policy in IIS
Tagged on:

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.