WCF Restful Services – CORS (Cross-origin resource sharing) Response
CORSEnablingBehavior.cs |
using System; using System.Collections.Generic; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Configuration; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; namespace SoccerRest { public class CORSEnablingBehavior : BehaviorExtensionElement, IEndpointBehavior { public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { endpointDispatcher.DispatchRuntime.MessageInspectors.Add( new CORSHeaderInjectingMessageInspector() ); } public void Validate(ServiceEndpoint endpoint) { } public override Type BehaviorType { get { return typeof(CORSEnablingBehavior); } } protected override object CreateBehavior() { return new CORSEnablingBehavior(); } private class CORSHeaderInjectingMessageInspector : IDispatchMessageInspector { public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) { return null; } private static IDictionary<string, string> _headersToInject = new Dictionary<string, string> { { "Access-Control-Allow-Origin", "*" }, { "Access-Control-Request-Method", "POST,GET,PUT,DELETE,OPTIONS" }, { "Access-Control-Allow-Headers", "X-Requested-With,Content-Type" } }; public void BeforeSendReply(ref Message reply, object correlationState) { var httpHeader = reply.Properties["httpResponse"] as HttpResponseMessageProperty; foreach (var item in _headersToInject) { httpHeader.Headers.Add(item.Key, item.Value); } } } } } |
web.conf |
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.web> … … </system.web> <system.serviceModel> <extensions> <behaviorExtensions> <add name="CORSBehavior" type="SoccerRest.CORSEnablingBehavior, SoccerRest, Version=1.0.0.0, Culture=neutral" /> </behaviorExtensions> </extensions> … … <behaviors> <endpointBehaviors> <behavior name="webBehavior"> <webHttp /> <CORSBehavior /> </behavior> </endpointBehaviors> <serviceBehaviors> … … </serviceBehaviors> </behaviors> </system.serviceModel> <system.webServer> … … </system.webServer> </configuration> |