[英]No 'Access-Control-Allow-Origin' header is present on the requested resource in web api
[英]MVC web api: No 'Access-Control-Allow-Origin' header is present on the requested resource
我尝试了本文中写的所有内容: http : //www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api ,但没有任何效果。 我正在尝试从 webAPI2 (MVC5) 获取数据以使用 angularJS 在另一个域中使用。
我的控制器看起来像这样:
namespace tapuzWebAPI.Controllers
{
[EnableCors(origins: "http://local.tapuz.co.il", headers: "*", methods: "*", SupportsCredentials = true)]
[RoutePrefix("api/homepage")]
public class HomePageController : ApiController
{
[HttpGet]
[Route("GetMainItems")]
//[ResponseType(typeof(Product))]
public List<usp_MobileSelectTopSecondaryItemsByCategoryResult> GetMainItems()
{
HomePageDALcs dal = new HomePageDALcs();
//Three product added to display the data
//HomePagePromotedItems.Value.Add(new HomePagePromotedItem.Value.FirstOrDefault((p) => p.ID == id));
List<usp_MobileSelectTopSecondaryItemsByCategoryResult> items = dal.MobileSelectTopSecondaryItemsByCategory(3, 5);
return items;
}
}
}
您需要在Web Api 中启用CORS 。 全局启用 CORS 的更简单和首选的方法是将以下内容添加到web.config
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
</system.webServer>
请注意,方法都是单独指定的,而不是使用*
。 这是因为在使用*
时发生了错误。
您还可以通过代码启用CORS 。
更新
需要以下NuGet包: Microsoft.AspNet.WebApi.Cors
。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.EnableCors();
// ...
}
}
然后你可以像这样在动作或控制器上使用[EnableCors]
属性
[EnableCors(origins: "http://www.example.com", headers: "*", methods: "*")]
或者你可以全局注册
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var cors = new EnableCorsAttribute("http://www.example.com", "*", "*");
config.EnableCors(cors);
// ...
}
}
您还需要办理预检Options
与请求HTTP OPTIONS
请求。
Web API
需要响应Options
请求,以确认它确实配置为支持CORS
。
要处理这个问题,您需要做的就是发回一个空响应。 您可以在您的操作中执行此操作,也可以像这样全局执行此操作:
# Global.asax.cs
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Flush();
}
}
添加此额外检查是为了确保设计为仅接受GET
和POST
请求的旧APIs
不会被利用。 想象一下,当这个动词不存在时,向一个设计的API
发送一个DELETE
请求。 结果是不可预测的,结果可能是危险的。
@Mihai-Andrei Dinculescu 的回答是正确的,但为了搜索者的利益,还有一个微妙的地方可能会导致此错误。
在 URL 末尾添加“/”将阻止 EnableCors 在所有情况下(例如从主页)工作。
即这行不通
var cors = new EnableCorsAttribute("http://testing.azurewebsites.net/", "*", "*");
config.EnableCors(cors);
但这会起作用:
var cors = new EnableCorsAttribute("http://testing.azurewebsites.net", "*", "*");
config.EnableCors(cors);
如果使用 EnableCors 属性,效果相同。
我遵循了Mihai-Andrei Dinculescu指出的所有步骤。
但就我而言,我还需要1 个步骤,因为 http OPTIONS 在 Web.Config 中被以下行禁用。
<remove name="OPTIONSVerbHandler" />
我刚刚从 Web.Config 中删除了它(只需像下面一样评论它),Cors 就像一个魅力
<handlers>
<!-- remove name="OPTIONSVerbHandler" / -->
</handlers>
可能是因为安装了 Cors nuget 包。
如果您在从 nuget 安装和启用 cors 后遇到问题,那么您可以尝试重新安装 web Api。
在包管理器中,运行Update-Package Microsoft.AspNet.WebApi -reinstall
试试这个,以确保你正确配置了 CORS:
[EnableCors(origins: "*", headers: "*", methods: "*")]
还是行不通? 检查 HTTP 标头是否存在。
我知道我来得很晚。 但是,对于正在搜索的任何人,我想我会发布最终对我有用的内容。 我并不是说这是最好的解决方案——只是说它有效。
我们的 WebApi 服务使用 config.EnableCors(corsAttribute) 方法。 然而,即便如此,它仍然会在飞行前请求上失败。 @Mihai-Andrei Dinculescu 的回答为我提供了线索。 首先,我添加了他的 Application_BeginRequest() 代码来刷新选项请求。 那仍然对我不起作用。 问题是 WebAPI 仍然没有向 OPTIONS 请求添加任何预期的标头。 单独冲洗它没有用 - 但它给了我一个想法。 我添加了自定义标头,否则这些标头将通过 web.config 添加到 OPTIONS 请求的响应中。 这是我的代码:
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Headers.Add("Access-Control-Allow-Origin", "https://localhost:44343");
Response.Headers.Add("Access-Control-Allow-Headers",
"Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
Response.Headers.Add("Access-Control-Allow-Credentials", "true");
Response.Flush();
}
}
显然,这仅适用于 OPTIONS 请求。 所有其他动词都由 CORS 配置处理。 如果有更好的方法来解决这个问题,我会全力以赴。 对我来说这感觉像是作弊,我更喜欢自动添加标题,但这最终奏效并让我继续前进。
要使任何 CORS 协议工作,您需要在每个端点(或具有此方法的全局过滤器)上都有一个 OPTIONS 方法,该方法将返回这些标头:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: content-type
原因是浏览器将首先发送一个 OPTIONS 请求来“测试”您的服务器并查看授权
我抓住了关于 cors 的下一个案例。 也许这对某人有用。 如果您将功能“WebDav 重定向器”添加到您的服务器,PUT 和 DELETE 请求将失败。
因此,您需要从 IIS 服务器中删除“WebDAVModule”:
或添加到您的配置:
<system.webServer>
<modules>
<remove name="WebDAVModule"/>
</modules>
<handlers>
<remove name="WebDAV" />
...
</handlers>
当您尝试从不同的域或不同的端口访问时,就会发生该问题。
如果您使用的是 Visual Studio,请转到“工具”>“NuGet 包管理器”>“包管理器控制台”。 在那里你必须安装 NuGet 包Microsoft.AspNet.WebApi.Cors
Install-Package Microsoft.AspNet.WebApi.Cors
然后,在 PROJECT > App_Start > WebApiConfig 中,启用 CORS
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//Enable CORS. Note that the domain doesn't have / in the end.
config.EnableCors(new EnableCorsAttribute("https://tiagoperes.eu",headers:"*",methods:"*"));
....
}
}
成功安装后,构建解决方案就足够了
@Mihai-Andrei Dinculescu 的回答对我有用,例如:
<system.webServer>
部分添加一个<httpProtocol>
global.asax
提到的Application_BeginRequest()
为OPTIONS
请求返回空响应除了他对Request.Headers.AllKeys.Contains("Origin")
检查对我不起作用,因为请求包含origing
,所以使用小写。 我认为我的浏览器(Chrome)会像这样为 CORS 请求发送它。
我通过使用他的Contains
检查的不区分大小写的变体来更通用地解决这个问题: if (culture.CompareInfo.IndexOf(string.Join(",", Request.Headers.AllKeys), "Origin", CompareOptions.IgnoreCase) >= 0) {
如果您的 web.config 中有 security\\requestFiltering 节点,如下所示:
<security>
<requestFiltering>
<verbs allowUnlisted="false">
<add verb="GET" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="PUT" allowed="true" />
<add verb="DELETE" allowed="true" />
<add verb="DEBUG" allowed="true" />
</verbs>
</requestFiltering>
确保你也添加这个
<add verb="OPTIONS" allowed="true" />
我已经尝试了所有可以在网上找到的方法,包括在这个答案中给出的方法。 在几乎尝试解决问题一整天之后,我找到了对我有用的解决方案。
在文件夹App_Start中的文件WebApiConfig中,注释所有代码行并添加以下代码:
`public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.EnableCors();
var enableCorsAttribute = new EnableCorsAttribute("*",
"Origin, Content-Type, Accept",
"GET, PUT, POST, DELETE, OPTIONS");
config.EnableCors(enableCorsAttribute);
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
//routeTemplate: "api/{controller}/{id}",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.Add(new BrowserJsonFormatter());
}
public class BrowserJsonFormatter : JsonMediaTypeFormatter
{
public BrowserJsonFormatter()
{
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
this.SerializerSettings.Formatting = Formatting.Indented;
}
public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
{
base.SetDefaultContentHeaders(type, headers, mediaType);
headers.ContentType = new MediaTypeHeaderValue("application/json");
}
}`
我知道人们一开始可能会觉得这很明显,但仔细想想。 如果您做错了什么,这通常会发生。
例如,我遇到了这个问题,因为我没有在我的主机文件中添加主机条目。 真正的问题是 DNS 解析。 或者我只是把基本 URL 弄错了。
如果身份令牌来自一台服务器,有时我会收到此错误,但我正在尝试在另一台服务器上使用它。
有时,如果您的资源有误,您会收到此错误。
如果您将 CORS 中间件放入链中太晚,您可能会得到这个。
避免多处启用 CORS,如 WebApiCOnfig.cs、提供者中的 GrantResourceOwnerCredentials 方法和 Controller Header 属性等。以下是导致访问控制允许来源的列表
下面的代码足以修复访问控制允许来源。 //确保 app.UseCors 应该是配置代码行的顶部。
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
//All other configurations
}
}
这减缓了我的问题。
安装包:Microsoft.AspNet.WebApi.Cors
转到:App_Start --> WebApiConfig
添加 :
var cors = new EnableCorsAttribute("http://localhost:4200", " ", " "); config.EnableCors(cors);
注意:如果您添加“/”作为特定 url 的结尾对我不起作用。
对于那些只是在 .NET 5 中创建 Web API 而不是 Web 应用程序的人,在Startup.cs
您需要像这样配置您的策略:
public void ConfigureServices(IServiceCollection services)
{
// Additional configs above...
services.AddCors(options =>
{
options.AddPolicy("AllowAnyOrigin", builder =>
{
// Allow "Access-Control-Allow-Origin: *" header
builder.AllowAnyOrigin();
});
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Add this above other config options...
app.UseCors("AllowAnyOrigin");
}
我知道这听起来很疯狂,但对我来说是 [HttpPost()] 而不是 [HttpPost]。 当我删除多余的括号时,它开始工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.