나는 간단한 동작 방법을 가지고 있는데, 그것은 json을 반환합니다. ajax.example.com에서 실행됩니다. 다른 사이트 someothersite.com에서이 사이트에 액세스해야합니다.
전화하려고하면 예상대로 얻을 수 있습니다 … :
Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.
이 문제를 해결하는 두 가지 방법 인 JSONP 와 헤더를 설정하기 위해 사용자 정의 HttpHandler 를 작성하는 방법을 알고 있습니다.
더 간단한 방법이 없습니까?
간단한 조치로 허용 된 원점 목록을 정의하거나 모든 사람을 허용 할 수 없습니까? 액션 필터일까요?
최적은 … :
return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);
답변
일반 ASP.NET MVC 컨트롤러
새로운 속성을 만듭니다
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
base.OnActionExecuting(filterContext);
}
}
작업에 태그를 지정하십시오.
[AllowCrossSiteJson]
public ActionResult YourMethod()
{
return Json("Works better?");
}
ASP.NET 웹 API
using System;
using System.Web.Http.Filters;
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Response != null)
actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
base.OnActionExecuted(actionExecutedContext);
}
}
전체 API 컨트롤러에 태그를 지정하십시오.
[AllowCrossSiteJson]
public class ValuesController : ApiController
{
또는 개별 API 호출 :
[AllowCrossSiteJson]
public IEnumerable<PartViewModel> Get()
{
...
}
Internet Explorer <= v9의 경우
IE <= 9는 CORS를 지원하지 않습니다. 프록시를 통해 해당 요청을 자동으로 라우팅하는 자바 스크립트를 작성했습니다. 모두 100 % 투명합니다 (내 프록시와 스크립트 만 포함하면됩니다).
너겟을 사용하여 다운로드 corsproxy
하고 포함 된 지침을 따르십시오.
답변
IIS 7 이상을 사용하는 경우 system.webServer 섹션에서 web.config 파일을 폴더의 루트에 넣을 수 있습니다.
<httpProtocol>
<customHeaders>
<clear />
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
참조 : http://msdn.microsoft.com/en-us/library/ms178685.aspx
및 http://enable-cors.org/#how-iis7
답변
요청이 쿠키를 통과했을 때 검색 한 콘텐츠 (예 : xhr에 있음 withCredentials=true
)를 브라우저가 거부 하고 사이트가로 Access-Control-Allow-Origin
설정되는 문제가 발생했습니다 *
. Chrome의 오류는 “자격 증명 플래그가 true 인 경우 Access-Control-Allow-Origin에서 와일드 카드를 사용할 수 없습니다.”입니다.
@jgauffin의 답변을 바탕으로 이것을 만들었습니다. 기본적으로 특정 브라우저 보안 검사를 해결하는 방법이므로주의하십시오.
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// We'd normally just use "*" for the allow-origin header,
// but Chrome (and perhaps others) won't allow you to use authentication if
// the header is set to "*".
// TODO: Check elsewhere to see if the origin is actually on the list of trusted domains.
var ctx = filterContext.RequestContext.HttpContext;
var origin = ctx.Request.Headers["Origin"];
var allowOrigin = !string.IsNullOrWhiteSpace(origin) ? origin : "*";
ctx.Response.AddHeader("Access-Control-Allow-Origin", allowOrigin);
ctx.Response.AddHeader("Access-Control-Allow-Headers", "*");
ctx.Response.AddHeader("Access-Control-Allow-Credentials", "true");
base.OnActionExecuting(filterContext);
}
}
답변
이것은 정말 간단합니다. web.config에 추가하십시오.
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://localhost" />
<add name="Access-Control-Allow-Headers" value="X-AspNet-Version,X-Powered-By,Date,Server,Accept,Accept-Encoding,Accept-Language,Cache-Control,Connection,Content-Length,Content-Type,Host,Origin,Pragma,Referer,User-Agent" />
<add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
<add name="Access-Control-Max-Age" value="1000" />
</customHeaders>
</httpProtocol>
</system.webServer>
Origin에서는 웹 서버에 액세스 할 수있는 모든 도메인을 헤더에 넣고 헤더에는 ajax http 요청에서 사용할 수있는 가능한 모든 헤더를 넣고 메소드에 서버에서 허용하는 모든 메소드를 넣습니다.
안부 🙂
답변
때로는 옵션 동사도 문제를 일으킨다
간단히 : 다음으로 web.config를 업데이트하십시오.
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
</customHeaders>
</httpProtocol>
</system.webServer>
httpGet 및 httpOptions로 웹 서비스 / 컨트롤러 헤더를 업데이트하십시오.
// GET api/Master/Sync/?version=12121
[HttpGet][HttpOptions]
public dynamic Sync(string version)
{
답변
WebAPI 2에는 다음을 사용하여 설치할 수있는 CORS 용 패키지가 있습니다.
Install-Package Microsoft.AspNet.WebApi.Cors -pre -project WebServic
이것이 설치되면 다음 코드를 따르십시오 : http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
답변
API를 사용하는 경우 메소드에이 행을 추가하십시오.
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");