2017-03-02 3 views
6

クロスドメインエラーをカバーするトピックのほとんどは読んでいますが、それでも動作させることはできません。 Webサイト内では、WCF Webサービスと通信するSilverlightモジュールを読み込みます。 localhostでは正常に動作し、エラーは発生しませんでした。

私は私が持っているポート50283を参照することWebServiceがhttp://localhost:50283上と同じフォルダにホストされている必要があり、ほとんどどこでも\ wwwrootにそれを含めクロスドメインエラーSilverlight + WCF

<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とにかく効果をもたらさなかった。私はclientaccesspolicy.xmlにローカルと同じネットワーク内の別のコンピュータの両方にアクセスできます(http://computerIP:50283/clientaccesspolicy.xmlの内容を表示しています)。
私はエラーの性質についていくつかの詳細を調べるためにエラーを傍受しようとしましたが、エラーは何も出ません。唯一のブラウザです。文字通り、私はすべてを試みましたが、変化はありません。誰もが似たような問題に直面していて、解決策を模索すべきところを示唆していますか?

私は
Silverlight-to-WCF cross-domain exception, but clientaccesspolicy.xml is being read successfully

+0

「http-request-headers」から「http-request-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を使用しています。これにより、クロスドメインファイルをWebサイト自体に追加する必要がなくなります。

endPoint.Behaviors.Add(new CrossDomainServiceBehavior()); 

またはCONFIGでWCF定義の場合: この例のために、私はCrossDomainServiceBehaviorは、名前空間であると仮定します(自己ホスト型サービスで例えば)コードから行動を追加する

Services.CrossDomainServiceBehaviorとそれが配置されているアセンブリは、中立の文化を持つバージョン1.0.0.0です。また、WebHttpというサービス宣言にバインドされていることを前提としています。(ここではwebHttpと呼ばれる一例として)

<behaviors> 
    <endpointBehaviors> 
    <behavior name="CrossDomainServiceBehavior"> 
     <webHttp/> 
     <CrossDomainServiceBehavior/> 
    </behavior> 
    </endpointBehaviors> 
<behaviors> 

が結合に振る舞いを追加します:

<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を実装する例1:

<endpoint address="" binding="webHttpBinding" contract="Services.ISomeService" bindingConfiguration="webHttp" behaviorConfiguration="CrossDomainServiceBehavior "/>