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>
당신이 날 도와 줄 수있다?
10,000 번 upvote하고 싶습니다. 나는 모든 것을 시도했다 - 설정 파일, 커스텀 IDispatchMessageInspector (헤더/asax에 추가 한 값)를 추가한다. - 'GET'은 항상 작동하지만 다른 모든 것은 boched되었다. 이것을 .asax로 옮겨서 해결해 주셔서 감사합니다. – schmoopy
위대한 도움을주었습니다 – Akhil
친절하게 도와주세요 : - https://stackoverflow.com/questions/27422063/cors-issue-calling-wcf-web-service-using-ajax-in-ie11-chrome –