我试图在我的ASP.NET Core Web API上启用跨源资源共享,但我被困住了.
该EnableCors属性接受policyName类型string为参数:
// Summary:
// Creates a new instance of the Microsoft.AspNetCore.Cors.Core.EnableCorsAttribute.
//
// Parameters:
// policyName:
// The name of the policy to be applied.
public EnableCorsAttribute(string policyName);
Run Code Online (Sandbox Code Playgroud)
这policyName意味着什么以及如何在ASP.NET Core Web API上配置CORS?
我正在尝试使用TypeScript和JQuery(来自Definitely Typed)与API进行交谈.
let ajaxsettings: JQueryAjaxSettings = {
url: this.url,
contentType: "application/json",
type: "POST",
data: JSON.stringify(this.apiRequest),
processData: false,
success: ( data, textStatus, jQxhr ) => {
console.log("Response:" + JSON.stringify(data));
},
error: ( jqXhr, textStatus, errorThrown ) => {
console.log("Error Response; " + JSON.stringify(jqXhr));
},
headers: {
"X-UserName": "blahblah",
"X-Password": "blahblah"
},
beforeSend: (request) => {
request.setRequestHeader("X-APIKey", "blahblahblah");
}
};
$.ajax(ajaxsettings);
Run Code Online (Sandbox Code Playgroud)
提出请求并查看Fiddler捕获的内容是相当奇怪的.
错误的HTTP谓词和标头包含在Access-Control-Request-Headers中,而不是标准标头.
JQuery 3.2.0,以及来自Definitely Typed的最新index.d.ts .
我可以在Fiddler中创建一个HTTP请求:
我正在尝试创建的请求:
更新
我已经尝试过使用dataType来解决预检检查:
contentType : "text/plain",
method: "POST",
type: "post", …Run Code Online (Sandbox Code Playgroud) 问题:
出于某种原因,启用 CORS 时,Access-Control-Allow-Origin响应中不包含标头。
错误:
从源“https://some.site.com”访问“https://.../api/endpoints/some-path”的 XMLHttpRequest 已被 CORS 政策阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。
配置 (.NET MVC 5)
web.config标头:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Credentials" value="true"/>
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, OPTIONS" />
</customHeaders>
</httpProtocol>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
Web API 配置:
config.EnableCors();
Run Code Online (Sandbox Code Playgroud)
API 端点:
[RoutePrefix("api/endpoints")]
[EnableCors(origins: "https://some.site.com", headers: "*", methods: "*")]
public class MyApiController : ApiController
{
[HttpPost]
[Route("some-path")]
[EnableCors(origins: "https://some.site.com", headers: "*", methods: "*")]
public ResponseModel GetSomeResponse(DataModel model) { ... }
}
Run Code Online (Sandbox Code Playgroud)
global.asax.cs
protected void Application_BeginRequest(object sender, EventArgs e) …Run Code Online (Sandbox Code Playgroud) 我们正在开发具有移动部件和Web UI的应用程序.Web UI使用angular,我们在后端配置cors时遇到问题.我们的代码看起来像这样(只是对我们的问题很重要的代码):
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseCors("AllowAll");
app.UseMvc();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
//Add Cors support to the service
services.AddCors(
options => options.AddPolicy(
"AllowAll", p => p.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
)
);
}
Run Code Online (Sandbox Code Playgroud)
从stackoverflow上的文档和其他帖子,这应该工作,但不是.我们错过了什么?
日Thnx
编辑:
这是POSTMAN的请求:
卷曲' https://guw.azurewebsites.net/api/token ' -X选项-H '杂注:无缓存' -H '访问控制请求-方法:POST' -H"来源: HTTP:// localhost:9000' -H'Eccept-Encoding:gzip,deflate,sdch,br'-H'Accept-Language:en-US,en; q = 0.8'-H'User-Agent:Mozilla/5.0(Windows NT 10.0 ; WOW64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/51.0.2704.103 Safari/537.36'-H'接受:/ ' - H'缓存控制:无缓存'-H'参考:http:// localhost: 9000 / '-H'连接:keep-alive'-H'Access-Control-Request-Headers:接受,授权,内容类型' - 压缩
你可以在邮递员中导入它并查看它.此请求由angular app发送.
希望这可以帮助.
最后我决定在我的中间件中添加这个方法:
private …Run Code Online (Sandbox Code Playgroud) 我创建了一个带有单个控制器的 ASP.Net CORE Web API 项目,现在想从客户端 (React) Web 应用程序调用它。
但是,调用失败,并显示“请求的资源上不存在‘Access-Control-Allow-Origin’标头。”。
从 Fiddler 调用同一个端点时,预期的响应标头不存在。
感谢 ATerry,我有了更深入的了解:标头不存在,因为 React Web 应用程序和 .Net Core Web API 托管在同一个盒子上。React 填充与 (API) 框相同的请求 Origin: 标头,因此服务器(非常聪明)不会添加 Allow-... 响应标头。然而,React 应用程序拒绝响应,因为缺少这些标头。
我正在使用 .Net Core v2.1(在撰写本文时最新)。
我构建的代码基于
https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.1
我检查了这些
https://weblog.west-wind.com/posts/2016/Sep/26/ASPNET-Core-and-CORS-Gotchas
...但没有一个建议奏效。
有任何想法吗?
这就是我配置 .Net Core 应用程序的方式(代码从实际更改为尝试并允许任何操作):
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. …Run Code Online (Sandbox Code Playgroud) asp.net-core ×2
c# ×2
cors ×2
.net-core ×1
api ×1
asp.net ×1
asp.net-mvc ×1
jquery ×1
reactjs ×1
typescript ×1