Cors 请求和 MVC5
Cors requests and MVC5
所以我在控制器上有一个视图...
[AllowAnonymous]
[Route("MyView")]
public ActionResult MyView()
{
// first attempt at solving problem
Response.AddHeader("Access-Control-Allow-Origin", "*");
Response.AddHeader("Access-Control-Allow-Headers", "*");
Response.AddHeader("Access-Control-Allow-Methods", "*");
return PartialView();
}
我尝试添加此属性(第二次尝试)...
public class AllowCors : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Headers", "*");
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Methods", "*");
base.OnActionExecuting(filterContext);
}
}
当我使用 owin 初始化我的应用程序时,我认为这可能有效(第三次尝试)...
app.Use((context, next) =>
{
if (context.Request.Method == "OPTIONS")
{
context.Response.StatusCode = 200;
context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "*" });
context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "*" });
return context.Response.WriteAsync("handled");
}
return next.Invoke();
}).UseStageMarker(PipelineStage.PreHandlerExecute);
问题是,如果我直接通过在浏览器中输入 url 来请求它,我会得到正确的 headers ...
Access-Control-Allow-Headers:*
Access-Control-Allow-Methods:*
Access-Control-Allow-Origin:*
...移交给邮递员进行测试,当我向同一个 URL 发出 OPTIONS 调用时,我在 headers ...
中得到了这个
Allow: OPTIONS, TRACE, GET, HEAD, POST
...那么如何让 MVC 正确响应 OPTIONS http 动词,以便我可以在网站域之外使用此视图?
编辑
值得注意的是,我已经环顾四周,发现了所有这些以及更多...
jQuery $.ajax(), $.post sending "OPTIONS" as REQUEST_METHOD in Firefox
AJAX in Chrome sending OPTIONS instead of GET/POST/PUT/DELETE?
Why does this jQuery AJAX PUT work in Chrome but not FF
...我也非常熟悉使用 CORS 和向 WebAPI 发出 CORS 请求,但出于某种原因,我似乎无法在没有得到这个的情况下向 MVC 发出 CORS 请求 "dummy"回复。
我认为我需要一种方法来覆盖/替换此基于 HttpVerb 的请求的 MVC 默认行为,以允许我在远程站点中嵌入视图。
安装这两个 nuget 包:
Microsoft.AspNet.Cors
Microsoft.Owin.Cors
然后在您的 Startup.cs
中的 Configuration
函数中添加这一行:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
app.UseCors(CorsOptions.AllowAll);
}
}
在我的演示设置中,我从域 http://example.local (Apache) to the domain http://localhost:6569/ (IIS Express) 发送 post 请求。
没有 app.UseCors(CorsOptions.AllowAll);
(注意控制台中的警告并且没有 CORS headers):
并且在添加包并将行添加到 Configuration
方法之后:
如您在屏幕截图中所见,access-control-allow-origin
已按预期添加到响应 headers 中/
所以我在控制器上有一个视图...
[AllowAnonymous]
[Route("MyView")]
public ActionResult MyView()
{
// first attempt at solving problem
Response.AddHeader("Access-Control-Allow-Origin", "*");
Response.AddHeader("Access-Control-Allow-Headers", "*");
Response.AddHeader("Access-Control-Allow-Methods", "*");
return PartialView();
}
我尝试添加此属性(第二次尝试)...
public class AllowCors : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Headers", "*");
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Methods", "*");
base.OnActionExecuting(filterContext);
}
}
当我使用 owin 初始化我的应用程序时,我认为这可能有效(第三次尝试)...
app.Use((context, next) =>
{
if (context.Request.Method == "OPTIONS")
{
context.Response.StatusCode = 200;
context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "*" });
context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "*" });
return context.Response.WriteAsync("handled");
}
return next.Invoke();
}).UseStageMarker(PipelineStage.PreHandlerExecute);
问题是,如果我直接通过在浏览器中输入 url 来请求它,我会得到正确的 headers ...
Access-Control-Allow-Headers:*
Access-Control-Allow-Methods:*
Access-Control-Allow-Origin:*
...移交给邮递员进行测试,当我向同一个 URL 发出 OPTIONS 调用时,我在 headers ...
中得到了这个Allow: OPTIONS, TRACE, GET, HEAD, POST
...那么如何让 MVC 正确响应 OPTIONS http 动词,以便我可以在网站域之外使用此视图?
编辑
值得注意的是,我已经环顾四周,发现了所有这些以及更多...
jQuery $.ajax(), $.post sending "OPTIONS" as REQUEST_METHOD in Firefox
AJAX in Chrome sending OPTIONS instead of GET/POST/PUT/DELETE?
Why does this jQuery AJAX PUT work in Chrome but not FF
...我也非常熟悉使用 CORS 和向 WebAPI 发出 CORS 请求,但出于某种原因,我似乎无法在没有得到这个的情况下向 MVC 发出 CORS 请求 "dummy"回复。
我认为我需要一种方法来覆盖/替换此基于 HttpVerb 的请求的 MVC 默认行为,以允许我在远程站点中嵌入视图。
安装这两个 nuget 包:
Microsoft.AspNet.Cors
Microsoft.Owin.Cors
然后在您的 Startup.cs
中的 Configuration
函数中添加这一行:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
app.UseCors(CorsOptions.AllowAll);
}
}
在我的演示设置中,我从域 http://example.local (Apache) to the domain http://localhost:6569/ (IIS Express) 发送 post 请求。
没有 app.UseCors(CorsOptions.AllowAll);
(注意控制台中的警告并且没有 CORS headers):
并且在添加包并将行添加到 Configuration
方法之后:
如您在屏幕截图中所见,access-control-allow-origin
已按预期添加到响应 headers 中/