मुझे याद है कि इस कई सालों पहले इसमें चल रहा था और इसे एक व्यवहार के साथ थोड़ा अलग तरीके से हल किया गया था। निम्नलिखित पर विचार करें:
using System;
using System.IO;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
using System.ServiceModel.Description;
using System.Xml;
internal class CrossDomainServiceBehavior : BehaviorExtensionElement, IEndpointBehavior
{
private ServiceHost serviceHost;
public override Type BehaviorType
{
get { return typeof(CrossDomainServiceBehavior); }
}
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
if (serviceHost == null)
{
serviceHost = new ServiceHost(typeof(CrossDomainPolicyService));
string address = new Uri(endpoint.Address.Uri, "/").ToString();
ServiceEndpoint crossDomainEndpoint = serviceHost.AddServiceEndpoint(typeof(ICrossDomainPolicyService), new WebHttpBinding(), address);
crossDomainEndpoint.Behaviors.Add(new WebHttpBehavior());
serviceHost.Open();
}
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
protected override object CreateBehavior()
{
return new CrossDomainServiceBehavior();
}
}
internal class CrossDomainPolicyService : ICrossDomainPolicyService
{
public Message ProvideClientAccessPolicyFile()
{
XmlReader xmlReader = CreateClientAccessXml();
return Message.CreateMessage(MessageVersion.None, string.Empty, xmlReader);
}
public Message ProvideCrossDomainPolicyFile()
{
XmlReader xmlReader = CreateCrossDomainXml();
return Message.CreateMessage(MessageVersion.None, string.Empty, xmlReader);
}
private static XmlReader CreateClientAccessXml()
{
TextReader reader = new StringReader(@"<?xml version='1.0' encoding='utf-8'?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers='*' >
<domain uri='*'/>
</allow-from>
<grant-to>
<resource path='/' include-subpaths='true'/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>");
return XmlReader.Create(reader);
}
private static XmlReader CreateCrossDomainXml()
{
TextReader reader = new StringReader(@"<?xml version='1.0'?>
<cross-domain-policy>
<allow-http-request-headers-from domain='*' headers='*'/>
</cross-domain-policy>");
return XmlReader.Create(reader);
}
}
CrossDomainServiceBehavior अपने WCF सेवा पर व्यवहार में जोड़े जाने की जरूरत है और यह गतिशील क्रॉस डोमेन नीति जोड़ने के लिए CrossDomainPolicyService उपयोग करता है। यह आपको वेबसाइट पर क्रॉस डोमेन फ़ाइल जोड़ने से रोकता है।
कोड से व्यवहार जोड़ा जा रहा है (स्वयं के साथ उदाहरण के लिए सेवाओं की मेजबानी की):
endPoint.Behaviors.Add(new CrossDomainServiceBehavior());
या config में WCF परिभाषाओं के मामले में: इस उदाहरण मैं CrossDomainServiceBehavior समझेंगे की खातिर नाम स्थान में है Services.CrossDomainServiceBehavior और यह असेंबली एक तटस्थ संस्कृति के साथ संस्करण 1.0.0.0 में स्थित है। यह भी मानता है कि आपको WebHttp नामक आपकी सेवा घोषणा पर बाध्यकारी है।
व्यवहार का पंजीयन:
<behaviors>
<endpointBehaviors>
<behavior name="CrossDomainServiceBehavior">
<webHttp/>
<CrossDomainServiceBehavior/>
</behavior>
</endpointBehaviors>
<behaviors>
बंधन को व्यवहार जोड़ें (यहाँ उदाहरण एक webHttp कहा जाता है के रूप में):
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="CrossDomainServiceBehavior" type="Services.CrossDomainServiceBehavior, CrossDomainServiceBehavior.AssemblyName, Version=1.0.0.0, Culture=neutral" />
</behaviorExtensions>
</extensions>
व्यवहार घोषित
<bindings>
<webHttpBinding>
<binding name="webHttp"
maxReceivedMessageSize="20000000" >
<security mode="None">
<transport clientCredentialType = "None"/>
</security>
</binding>
<CrossDomainServiceBehavior />
</webHttpBinding>
</bindings>
अंत में, व्यवहार को अपने सेवा अंतराल में जोड़ें, उदाहरण में उदाहरण में जो ISomeService लागू करता है:
<endpoint address="" binding="webHttpBinding" contract="Services.ISomeService" bindingConfiguration="webHttp" behaviorConfiguration="CrossDomainServiceBehavior "/>
बस 'http अनुरोध-हेडर =" * "के लिए समस्या निवारण परिवर्तन' http अनुरोध-headers' के लिए 'यकीन है कि अनुरोध हालांकि जा सकते हैं अनुमति दी है, तो आप प्रतिबंध जोड़ के रूप में पीछे की ओर काम करते हैं कि बनाने के लिए। यदि सभी शीर्षकों के साथ यह अभी भी अनुमति नहीं देता है तो समस्या कहीं और है। एक आग दीवार सेटिंग शायद? – Nkosi