Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET中CORS的问题_C#_Asp.net Mvc_Asp.net Web Api_Cors_Http Status Code 405 - Fatal编程技术网

C# ASP.NET中CORS的问题

C# ASP.NET中CORS的问题,c#,asp.net-mvc,asp.net-web-api,cors,http-status-code-405,C#,Asp.net Mvc,Asp.net Web Api,Cors,Http Status Code 405,我有这个应用程序,我想在Web.Config中设置我的自定义标题,唉,这并不总是万无一失的 <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Methods" value="*" /> <add name="Access-Control-Allow-Headers" value

我有这个应用程序,我想在Web.Config中设置我的自定义标题,唉,这并不总是万无一失的

  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="*" />
    <add name="Access-Control-Allow-Headers" value="*" />
  </customHeaders>

为什么这里面有这么多含糊不清的地方?我如何确定
CORS
将一直在哪里工作?我对在
Web.config
上设置CORS非常感兴趣,因为我希望在部署的版本中能够灵活地修改它。

我认为出现您的“随机”问题是因为您没有处理
PUT
Delete
动词的飞行前
选项
请求

对于上面提到的两个动词,将生成一个额外的请求,
Options
webapi
需要响应该请求,以确认它确实配置为支持
CORS

要处理这个问题,您只需发送一个空响应。您可以在您的操作中执行此操作,也可以像这样全局执行此操作:

protected void Application_BeginRequest()
{
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
    {
        Response.Flush();
    }
}

添加此额外检查是为了确保设计为仅接受
GET
POST
请求的旧
api
不会被利用。想象一下,向一个
API
发送一个
DELETE
请求,该API是在这个动词不存在的情况下设计的。结果是不可预测的,结果可能是危险的

另外,在
web.config
中,您应该指定方法,而不是使用
*

<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>

CORS没有歧义,您需要考虑一些案例

1-如果要为Web API启用CORS,请仅使用“Microsoft.AspNet.WebApi.CORS”库

2-如果您想为整个网站(包括Web API、信号器等)启用CORS,请使用“Microsoft.Owin.CORS”库

使用上述2个库肯定会起作用,并且会启用cors,现在如果您想配置url,可以从数据库/config文件中进行配置,因此当应用程序启动url时,您可以从数据库/config文件中传递给EnableCors,但底线是避免在web.config中添加任何cors头

要知道如何为您的Web API启用CORS,您可以看看我的文章,它为Web API启用CORS并从AngularJS客户端使用它


希望能有所帮助。

对于阅读本文的任何人来说,这可能会有所帮助

即使使用以下启动代码

var cors = new EnableCorsAttribute("*", "*", "GET, POST, PUT, DELETE, OPTIONS");
config.EnableCors(cors);
我必须明确地将动词添加到Web Api操作方法中:

[Route("sanity")]
[HttpOptions]
[HttpPost]
public List<PostImportView> Sanity(SanityFilter filter)
{
    ....
[路由(“健全”)]
[HttpOptions]
[HttpPost]
公共列表健全性(健全过滤器过滤器)
{
....

非常无意义和恼人

是的,这似乎是个问题。这个问题似乎是随机的,但从我从你的帖子中读到的,似乎不是。你能解释一下原因吗?这个额外的检查是为了确保配置为只接受GET和post请求的旧API不会被利用。想象一下将删除谓词发送到在该谓词不存在时设计的API。结果不确定,可能会对该API背后的数据造成严重问题。
var cors = new EnableCorsAttribute("*", "*", "GET, POST, PUT, DELETE, OPTIONS");
config.EnableCors(cors);
[Route("sanity")]
[HttpOptions]
[HttpPost]
public List<PostImportView> Sanity(SanityFilter filter)
{
    ....