いくつかの WCF サービスを使用する Silverlight アプリがあります。Silverlight アプリを実行すると、すべて正常に動作します。別の人は問題なく使用できますが、大多数のユーザーはエラーになります。
「URI 'xxxxx' へのリクエストを試行中にエラーが発生しました。これは、適切なクロスドメイン ポリシーが設定されていないか、SOAP に不適切なポリシーを使用せずにクロスドメインの方法でサービスにアクセスしようとしたことが原因である可能性があります。 You may need to contact the owner of the service to publish a cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent. このエラーは、Web サービス プロキシで内部型を使用せずに使用した場合にも発生する可能性があります。 InternalsVisibleToAttribute 属性を使用しています。詳細については、内部例外を参照してください。"
WCF トレースを有効にすると、これらのユーザーが Silverlight アプリにアクセスしたときに、いくつかのエラーに気付きました。
1) 構成評価コンテキストが見つかりません。2) コンテンツ タイプ application/soap+xml; charset=utf-8 が text/xml を期待するサービスに送信されました。文字セット=utf-8
ここに私の設定ファイルがあります:
WCF のサーバー構成:
<?xml version="1.0"?>
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="All"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "c:\log\Traces.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<authentication mode="Windows"/>
<identity impersonate="false"/>
<customErrors mode="Off" />
</system.web>
<appSettings>
</appSettings>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
Silverlight でのクライアント構成は次のとおりです。
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISLtoCRM" maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
<security mode="None" />
</binding>
<binding name="BasicHttpBinding_ISLtoSQL" maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://xxxx.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISLtoCRM" contract="SLCRMSrvc.ISLtoCRM"
name="BasicHttpBinding_ISLtoCRM" />
<endpoint address="http://yyyy.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISLtoSQL" contract="SLSQLSrvc.ISLtoSQL"
name="BasicHttpBinding_ISLtoSQL" />
</client>
</system.serviceModel>
</configuration>
WCF サービスは、Windows Server 2008 R2 上の IIS 6.1 でホストされています。アプリケーション プールは、特定のユーザーの下で実行するように設定されています。マネージド パイプライン モードはクラシックであり、IIS のサイトで匿名認証が有効になっています。他のすべての認証は無効になります。
これを理解するのに何か助けはありますか?私と別のユーザーがアプリに問題なくアクセスできる理由がわかりませんが、ほとんどのユーザーはアクセスできません。セキュリティの問題ですか、それとも WCF サービスの作成方法に問題がありますか?
WCF の更新されたサーバー構成:
<?xml version="1.0"?>
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="All"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "c:\log\Traces.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<customErrors mode="Off" />
<authentication mode="Windows" />
</system.web>
<appSettings>
</appSettings>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="MyBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="CRMWCF.SLtoCRM" behaviorConfiguration="CRMBehavior">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="MyBinding" contract="CRMWCF.ISLtoCRM" />
</service>
<service name="CRMWCF.SLtoSQL" behaviorConfiguration="CRMBehavior">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="MyBinding" contract="CRMWCF.ISLtoSQL" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="CRMBehavior">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Method" value="GET,PUT,POST,DELETE,OPTIONS"/>
<add name="Access-Control-Allow-Headers" value="Content-Type"/>
</customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>