2014-02-06 6 views
2

wcf rest service에서 일하고 있습니다. 크로스 도메인 액세스를 지원해야합니다. 나는 기사를 읽고 2 가지 방법을 얻었다.CORS 지원 WCF REST 및 검도

첫 번째 방법은 global.asax의 application_beginrequest 이벤트에 http 헤더를 추가하는 것입니다. 이것은 나를 위해 잘 작동합니다. jquery를 사용하여 검도 차트 바인드를 사용하여 이것을 테스트했습니다. 차트는 IE, Chrome 및 Firefox에 채워집니다. 의 Global.asax에 CORS를 가능하게하는 작업 코드는

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 

     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
     if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
     { 
      //These headers are handling the "pre-flight" OPTIONS call sent by the browser 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET"); 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Authorization, Origin, Content-Type, Accept, X-Requested-With"); 
      HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); 
      HttpContext.Current.Response.End(); 
     } 
    } 

입니다하지만 난 내가이 link을 따라 있도록 속성을 활성화 고르를 구성해야합니다. 성공한 서비스를 복사하여 실행합니다. 그러나 클라이언트가 크롬 및 Firefox에서 차트를 표시하지 않은 엔드 포인트에서이 동작을 사용 가능하게 한 후에. 따라서 교차 도메인을 사용할 수 없습니다. 내가 맞습니까? 여기서 나는 그리워.

내 새로운 서비스 클래스는 다음과 같습니다.

public class CorsEnabledBehavior : BehaviorExtensionElement, IEndpointBehavior 
{ 
    public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
    { 

    } 

    public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) 
    { 

    } 

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) 
    { 
     var requiredHeaders = new Dictionary<string, string>(); 

     requiredHeaders.Add("Access-Control-Allow-Origin", "*"); 
     requiredHeaders.Add("Access-Control-Request-Method", "POST,GET,PUT,DELETE,OPTIONS"); 
     requiredHeaders.Add("Access-Control-Allow-Headers", "X-Requested-With,Content-Type"); 

     endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new CorsEnabledMessageInspector(requiredHeaders)); 
    } 

    public void Validate(ServiceEndpoint endpoint) 
    { 

    } 

    public override Type BehaviorType 
    { 
     get { return typeof(CorsEnabledBehavior); } 
    } 

    protected override object CreateBehavior() 
    { 
     return new CorsEnabledBehavior(); 
    } 

} 

public class CorsEnabledMessageInspector : IDispatchMessageInspector 
{ 
    Dictionary<string, string> requiredHeaders; 
    public CorsEnabledMessageInspector(Dictionary<string, string> headers) 
    { 
     requiredHeaders = headers ?? new Dictionary<string, string>(); 
    } 

    public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext) 
    { 
     return null; 
    } 

    public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
    { 
     var httpHeader = reply.Properties["httpResponse"] as HttpResponseMessageProperty; 
     foreach (var item in requiredHeaders) 
     { 
      httpHeader.Headers.Add(item.Key, item.Value); 
     } 
    } 
} 

내 웹 구성 내가 그리워 곳

<extensions> 
    <behaviorExtensions> 
    <add name="corsEnabledBehaviour" type="LAMI.Service.Utilities.CorsEnabledBehavior, LAMI.Service.Utilities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </behaviorExtensions> 
</extensions> 

<behaviors> 
    <endpointBehaviors> 
    <behavior name="endBehaviour1"> 
     <webHttp helpEnabled="true" /> 
     <corsEnabledBehaviour /> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name="serviceBehaviour1"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<bindings> 
    <webHttpBinding> 
    <binding name="webHttpConfiguration" > 
    </binding> 
    </webHttpBinding> 
</bindings> 

<services> 
    <service behaviorConfiguration="serviceBehaviour1" name="LAMI.Service.Service1"> 
    <endpoint address="" behaviorConfiguration="endBehaviour1" binding="webHttpBinding" 
     bindingConfiguration="webHttpConfiguration" contract="LAMI.Service.Contract.IService1" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://ltms0/ServiceApp/Service1/" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 

당신이 날 도와 줄 수있다?

+0

10,000 번 upvote하고 싶습니다. 나는 모든 것을 시도했다 - 설정 파일, 커스텀 IDispatchMessageInspector (헤더/asax에 추가 한 값)를 추가한다. - 'GET'은 항상 작동하지만 다른 모든 것은 boched되었다. 이것을 .asax로 옮겨서 해결해 주셔서 감사합니다. – schmoopy

+0

위대한 도움을주었습니다 – Akhil

+0

친절하게 도와주세요 : - https://stackoverflow.com/questions/27422063/cors-issue-calling-wcf-web-service-using-ajax-in-ie11-chrome –

답변

2

이 작업을 완료했습니다. global.asax를 사용하고 성공적으로 작업 할 수있게되었습니다. 문제는 iecors.js입니다. 이것은 Internet Explorer 8 및 9에서 cors를 사용하도록 작동하지 않습니다. 다른 모든 브라우저는 정상적으로 작동합니다.