2010-06-09 3 views
10

그래서 jQuery에서 호출하는 C# WCF REST 서비스를 만들려고합니다. jQuery는 AJAX 호출이 동일한 출처 정책에 따라 이루어져야 함을 발견했습니다. 진행 방법에 대해 몇 가지 질문이 있습니다.WCF REST with jQuery AJAX - 같은 원본 정책을 제거/해결

나는 이미 알고있다.
1. 서버 콜백이 포함 된 JSONP의 해킹 솔루션
2. 크로스 도메인 프록시가있는 서버 오버 헤드가 너무 많습니다.
3. 브라우저에서 Flash를 사용하여 전화를 걸고 내 WCF 서버 루트에 crossdomain.xml을 설정합니다.

나는 이것을 사용하지 않을 것이다.
1. JSON을 사용하고 싶지 않거나 적어도 사용하기를 원하지 않습니다.
2. 정적 페이지를 제공하는 서버와 응용 프로그램 상태를 제공하는 서버를 분리하고 싶습니다.
3.이 날의 플래시는 문제가되지 않습니다.

내가 생각하는 것 : jQuery에서 작동하는 Flash의 crossdomain.xml 파일 같은 것이 있습니까? 이 "동일 출처"정책이 jQuery의 일부입니까, 아니면 특정 브라우저에서의 제한입니까? jQuery의 일부일뿐입니다. 코드를 파헤 치면 해결할 수 있습니다.





편집 :
Shreddd은 꽤 많은 자리, 아래 참조 얻었다. "*"

private void BypassCrossDomain() 
{ 
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*"); 
} 

이 사이트 간 스크립팅 공격을 허용 것이 중요합니다, 당신은 또한 사용할 수 없습니다 : C#에서이 작업을 수행하려면 나는 서비스의 모든 메소드 호출하는 데 필요한 다음과 같은 방법을 만들어 요청에 따라 타사 쿠키를 보내야하는 경우

답변

5

웹 서비스에서 도메인 간 요청을 가능하게하는 추가 HTTP 헤더를 뱉어내는 것도 고려해 볼 수 있습니다.

여기에 설명되어

Access-Control-Allow-Origin: * 

브라우저 것입니다 :

http://www.w3.org/TR/cors/

https://developer.mozilla.org/en/HTTP_access_control

그래서 당신은 당신의 웹 서비스가 제공하는 모든 콘텐츠에 다음과 같은 헤더를 추가하는 경우 해당 웹 서비스에 대한 도메인 간 요청을 허용합니다. 이것은 대부분의 최신 브라우저 (ff 3.5, IE 8, 사파리 4)에서 지원되며 바코드로 ajax 호출을하는 도메인 foo.com에서 호스팅되는 jquery 응용 프로그램에 매우 적합합니다.

+0

최근에 이것을 사용하기 시작했습니다. – csauve

1

불행하게도, 동일 출처 정책은 jQuery를의 명시 적으로 브라우저의 제한, 일부가 아닌, 그래서 당신이 그 주위에 방법을 찾을거야 의심한다.

JSONP 솔루션을 사용하는 것이 가장 좋습니다. 예, 당신은 "해킹"이라고 주장 할 수 있지만, 반대하는 이유 (즉, 가능한 유일한 옵션)에 대해 매우 널리 받아 들여지는 "해킹"입니다.

서비스 호출의 양쪽 끝을 모두 제어 할 수 있다면 JSONP 스타일 사용 패턴을 사용할 수는 없지만 실제로 JSON은 사용하지 않을 이유가 없습니다. 서버 응답은 클라이언트 측의 JavaScript 함수에 전달 될 것이기 때문에 문자열을 XML로 반환하는 것을 막을 수는 없습니다 & 콜백 구문을 사용하면 &을 처리 할 수 ​​있습니다 (실제로는 실제로 사용자를 "해킹 " 영토).

+0

박람회. 코드가 브라우저에 코드화되어 있다면, 내가 갇혀있는 것 같아. – csauve

+0

아래를 참조하십시오. 아니오 jsonp. xml 데이터 및 json 데이터 용으로 작동합니다. – csauve

0

사냥 2 일 마침내 나는 이것을 발견했다! 당신이 csuave보다!

내 WCF 앱이 자체 호스팅 (app.config에 XML을 추가하면 web.config가 도움이되지 못함)하지만 작동합니다.

private void BypassCrossDomain() 
{ 
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-  Origin", "*"); 
} 

은 - 호스팅 자체가 작동하지 않습니다 : 충분히

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.webServer> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" 
      value="*" /> 
     </customHeaders> 
    </httpProtocol> 
</system.webServer> 

+1

FYI Access-Control-Allow-Origin = *는 사이트 간 스크립팅을 허용합니다. 또한 요청과 함께 쿠키를 보내야하는 경우 "*"를 사용할 수 없습니다. 필요한 경우 더 확장 할 수 있습니다. – csauve