У меня есть веб-API Asp.net core 3. Я вызываю один из POST API, используя Fetch, и получаю следующие ошибки:
Access to fetch at 'https://localhost:44395/api/challengeresponse/Verify' from origin 'null' 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. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
Failed to load resource: net::ERR_FAILED
Поэтому я исследую и пробую следовать коду веб-API:
Startup.cs
private readonly string AllowedOriginPolicy = "_AllowedOriginPolicy";
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(AllowedOriginPolicy,
builder =>
{
var corsOrigins = new String[1] { "https://localhost:44395" };
builder.WithOrigins(corsOrigins).AllowCredentials().AllowAnyHeader().AllowAnyMethod();
});
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors(AllowedOriginPolicy); //at the end of the method.
}
Тем не менее, я получаю те же ошибки.
Мой код выборки:
образец.js
async function fetchdata(){
let _data = {
OriginalData: "coordinateid",
Signature: "URL",
Certificate: "introduction"
}
const response = await fetch('https://localhost:44395/api/challengeresponse/Verify', {
credentials: 'include',
method: "POST",
body: JSON.stringify(_data),
headers: {"Content-type": "application/json; charset=UTF-8"}
})
.then(response => response.json())
.then(json => console.info(json))
.catch(err => console.info(err));
}
Это очень распространенный вопрос, но все же я не могу решить. Пожалуйста помоги.
Редактировать: Пожалуйста, предложите для http://
и https://
оба типа URL-адресов. Потому что я также развернул этот веб-API на главном сервере, и доступ с URL-адреса сервера также дает ту же ошибку.
Ваш файл javascript запускается с html-страницы и размещается на локальном сервере? Вы столкнетесь с некоторыми проблемами, если просто откроете файл из своего браузера локально.
Да, файл javascript запускается из файла HTML.
Этот адрес https://localhost:44395
в
var corsOrigins = новая строка [1] { "https://localhost:44395" };
Это должен быть URL клиента. Это должно быть изменено, чтобы быть таким:
var corsOrigins = new String[1] { "[client url]" };
Примечание. Независимо от того, какой клиент вы используете, убедитесь, что он работает на сервере.
после этого изменения также были внесены такие же изменения в fetchdata()
URL. Теперь получаю ошибку: net::ERR_CONNECTION_REFUSED
@Varsh, ошибка означает, что URL-адрес не может найти сервер. Какой клиент используете?
Я не совсем понимаю, о чем вы спрашиваете, поскольку я не очень удобен в этом. Но я запускаю свой проект веб-API, после чего вызываю его POST API из простого файла javascript, который получает вызовы со страницы HTML в браузере Chrome.
@Varsh, как запустить этот javascript, открыть его напрямую? Какой у вас адрес клиента?
Откройте HTML-файл в браузере. Адрес file:///D:/Varsha/Project/main.html
@Varsh, такой способ открытия неверен. Вы можете разместить его на сервере, а затем получить доступ к этому html через адрес, например: 127.0.0.1:8080/main.html
Хорошо, согласно моему следующему шагу. Я развернул этот веб-API на сервере (главный сервер компании). URL-адрес которого http://***:***/api/challengeresponse/Verify
. И вызов этого URL-адреса из fetch. В этом случае каким должен быть var corsOrigins= new String[1] { url }
URL?
@Varsh, вам нужно поместить main.html на сервер.
Но если веб-API уже развернут на определенном сервере, он должен быть доступен из любого места, если установлена политика COR. Я ошибаюсь?
Да, но теперь, если вы не хотите развертывать веб-API, вам нужно поставить клиент на сервер. У вас есть визуальный звуковой код или любой другой редактор кода для разработки клиента?
Я уже развернул его на сервере (ссылка начинается с http://). И хотите получить к нему доступ оттуда. (localhost только для тестирования)
Можете ли вы показать URL вашего клиента сейчас? Потому что вы поставили клиент на сервер.
http://serveripaddress/server/index.php/login?user=
такой URL есть.
Можете ли вы поставить main.html
в serveripaddress
? Затем откройте html с помощью http://serveripaddress/main.html
и измените URL-адрес в webapi: var corsOrigins = new String[1] { "http://serveripaddress" };
так что в основном var corsOrigins = new String[1] { "http://serveripaddress" };
нужен URL-адрес клиента, с которого мы вызываем API?
Да, этот URL-адрес является URL-адресом клиента.
Хорошо, спасибо, сэр. Проблема решается, когда я меняю var corsOrigins = new String[1] { "http://serveripaddress" };
.
И еще один вопрос, если я хочу разрешить любому клиенту без указания определенного URL. Затем?
Вы можете использовать этот метод builder.AllowAnyOrigin()
в вебапи, он позволит любому клиенту.
origin null
предполагает, что страница, отправляющая запрос, не обслуживается с использованием http[s]