2017-03-02 13 views
6

मैंने क्रॉस-डोमेन त्रुटि को कवर करने वाले अधिकांश विषयों को पढ़ा है और अभी भी इसे काम नहीं कर सकता है। वेबसाइट के भीतर, मैं सिल्वरलाइट मॉड्यूल लोड करता हूं जो डब्ल्यूसीएफ वेबसाइट सेवा के साथ संचार करता है। स्थानीयहोस्ट पर, यह ठीक काम करता है, कोई त्रुटि नहीं हुई।

मुझे लगता है कि बंदरगाह 50,283 संदर्भित करता है मेरे पास करने के लिए वेब सेवा http://localhost:50283 पर और एक ही फ़ोल्डर में की मेजबानी की है clientaccesspolicy.xml स्थित जो के रूप में शायद ही हर जगह \ wwwroot लेकिन यह है कि सहितक्रॉस-डोमेन त्रुटि सिल्वरलाइट + डब्ल्यूसीएफ

<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> 

मैं clientaccesspolicy.XML रखा इस प्रकार लग रहा है वैसे भी कोई प्रभाव नहीं लाया। मैं clientaccesspolicy.xml दोनों स्थानीय और एक ही कंप्यूटर पर एक ही नेटवर्क के भीतर (http://computerIP:50283/clientaccesspolicy.xml प्रदर्शित सामग्री) तक पहुंच सकता हूं।
मैंने त्रुटि की प्रकृति के बारे में कुछ और जानकारी जानने के लिए त्रुटि को अवरुद्ध करने का प्रयास किया लेकिन फिडलर किसी भी त्रुटि को सूचीबद्ध नहीं करता है, केवल ब्राउज़र ही करता है। सचमुच, मैंने सब कुछ करने की कोशिश की और अभी भी कोई बदलाव नहीं आया। क्या किसी को भी इसी तरह के मुद्दे का सामना करना पड़ा है और कुछ संकेत प्रदान कर सकते हैं जहां मुझे समाधान की तलाश करनी चाहिए?

मैं भी कोई समाधान के साथ इसी तरह के विषय में भाग,
Silverlight-to-WCF cross-domain exception, but clientaccesspolicy.xml is being read successfully

+0

बस 'http अनुरोध-हेडर =" * "के लिए समस्या निवारण परिवर्तन' http अनुरोध-headers' के लिए 'यकीन है कि अनुरोध हालांकि जा सकते हैं अनुमति दी है, तो आप प्रतिबंध जोड़ के रूप में पीछे की ओर काम करते हैं कि बनाने के लिए। यदि सभी शीर्षकों के साथ यह अभी भी अनुमति नहीं देता है तो समस्या कहीं और है। एक आग दीवार सेटिंग शायद? – Nkosi

उत्तर

1

सुनिश्चित नहीं हैं कि अगर यह इसके साथ कुछ भी करने को है अफसोस, लेकिन मैं एक समान सेटअप है और मेरे clientaccesspolicy.xml थोड़ा अलग दिखता है।

<?xml version="1.0" encoding="utf-8" ?> 
<access-policy> 
    <cross-domain-access> 
    <policy> 
     <allow-from http-request-headers="SOAPAction"> 
     <domain uri="http://*"/> 
     <domain uri="https://*" /> 
     </allow-from> 
     <grant-to> 
     <resource include-subpaths="true" path="/"/> 
     </grant-to> 
    </policy> 
    </cross-domain-access> 
</access-policy> 

खासकर http और https एड्रेस का विभाजन अलग है। इसके अलावा आप इसे गैर-डिफ़ॉल्ट पोर्ट के साथ करने का प्रयास कर रहे हैं, क्या आपने इसे डिफ़ॉल्ट पोर्ट 80 पर आजमाया है? ओह और उत्पादन वातावरण पर उन * को वास्तविक डोमेन नाम से बदल दिया गया है।

3

मुझे याद है कि इस कई सालों पहले इसमें चल रहा था और इसे एक व्यवहार के साथ थोड़ा अलग तरीके से हल किया गया था। निम्नलिखित पर विचार करें:

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 "/> 
संबंधित मुद्दे