这是我的API:
[ApiController]
[Route("[controller]")]
public class APIController : ControllerBase
{
// [Authorize]
[HttpGet("[action]")]
public string GetInformation() { return "Something !"; }
}
这是我在 ASP.NET Core 5 MVC Web 应用程序中的操作:
public async Task<IActionResult> GetInfoFromAPI()
{
using var client = new HttpClient();
var requ = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("http://localhost:5000/API/GetInformation"),
Content = new StringContent(string.Empty, Encoding.UTF8, MediaTypeNames.Application.Json)
};
var resp = await client.SendAsync(requ);
var Result = await resp.Content.ReadAsStringAsync();
return View("GetInfoFromAPI", Result);
}
太棒了!它是如何工作的?为什么它有效?我没有在 API 启动中启用“跨源请求”(CORS)!
如果任何来源的
HttpGet/Post/...
都可以从我的API获取信息,那么CORS是什么?它有什么用?
进一步解释 Yehor 在评论中所说的话:
跨源资源共享是网络浏览器中的一项安全功能,其目的是帮助限制一个源(域)上的脚本向另一个源发出请求。开发此机制是为了缓解跨站点请求伪造 (CSRF/XSRF)、跨站点脚本 (XSS) 和其他跨源攻击等攻击。识别出跨源请求后,浏览器会向目标服务器发送带有“Origin”标头的 HTTP 请求。然后,服务器使用 CORS 标头进行响应,指示请求是否可接受,这取决于服务器的 CORS 策略配置。
在您的情况下,CORS 策略不相关,因为两台服务器在反向通道(机器到机器)中进行通信,而不涉及浏览器。换句话说,由于 CORS 是一种应用于 Web 浏览器级别(前通道)的机制,因此当两个服务器在 bnack 通道中通信而不涉及浏览器时,它不适用。希望这有帮助。
这里的文档展示了如何在 ASP.NET Core 应用程序中启用跨域资源共享 (CORS)。
错误浏览器安全性防止网页向某个网页发出请求 与提供该网页的域不同的域。这 这种限制称为“同源”策略。同源策略 防止恶意站点从另一个站点读取敏感数据 地点。有时,您可能希望允许其他网站进行 对您的应用程序的跨域请求。
因此,浏览器会报告
。在你的场景中,它是mvc项目(一种服务器应用程序)调用web api(也是一种服务器应用程序),这里没有浏览器交互,这就是我们没有收到CORS错误的原因。顺便说一句,通过 postman 之类的工具测试 API 也不会出现 CORS 错误,因为 CORS 是由客户端的浏览器实现的,本质上是用来阻止访问跨域资源。 不同的IP或端口也会导致CORS错误,这就是为什么我们有
.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()