0

SilverlightアプリケーションからセルフホストのWCFサービスを利用しようとしていますが、機能していません。サービスはSSLを使用するように構成されており、WebブラウザーであるWCFTestClientツールを使用してアクセスでき、Silverlightプロジェクト内からサービスを参照して更新できます。問題は、Silverlightアプリケーションがサービスを呼び出そうとすると、次のエラーで爆撃することです。

サーバーは意味のある応答を提供しませんでした。これは、コントラクトの不一致、セッションの早期シャットダウン、または内部サーバーエラーが原因である可能性があります。

WCF Test Clientツールを使用してヒットすると、問題なくデータが返されます(予想どおり)。

何か案は?

以下は私のアプリの設定です:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="basicHttp" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="6553600" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
          <security mode="Transport">
          </security>
        </binding>
      </basicHttpBinding>
      <webHttpBinding>
        <binding name="webHttp" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="6553600" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
          <security mode="Transport">
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <services>
      <service name="Application.ServiceModel.ApplicationService" behaviorConfiguration="serviceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="https://192.168.1.171:8000/ApplicationServiceModel/service"/>
          </baseAddresses>
        </host>
        <endpoint address="" 
                  binding="basicHttpBinding" 
                  bindingConfiguration="basicHttp" 
                  contract="Application.ServiceModel.IApplicationService"  />
        <endpoint address="mex" 
                  binding="mexHttpsBinding" 
                  contract="IMetadataExchange"/>
        <endpoint address="http://localhost:8000/"
                  binding="webHttpBinding"
                  contract="Application.ServiceModel.IApplicationService"
                  behaviorConfiguration="webHttpBehavior" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="serviceBehavior">
          <serviceMetadata httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="webHttpBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
4

2 に答える 2

3

@carlos:あなたのコードはhttpでうまく機能します。ただし、httpsで動作させることができません。「clientaccesspolicy.xml」が見つかりません...

main関数に次の変更を加えました。

                public static void Main()
        {
            string baseAddress = "https://" + Environment.MachineName + ":8000";
            ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
            BasicHttpBinding basicHttpBinding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
            host.AddServiceEndpoint(typeof(ITest), basicHttpBinding, "basic");
            WebHttpBinding webHttpBinding = new WebHttpBinding(WebHttpSecurityMode.Transport);
            HttpTransportSecurity httpTransportSecurity = webHttpBinding.Security.Transport;
            httpTransportSecurity.ClientCredentialType = HttpClientCredentialType.None;
            httpTransportSecurity.ProxyCredentialType = HttpProxyCredentialType.None;
            WebHttpBehavior webHttpBehavior = new WebHttpBehavior();

            host.AddServiceEndpoint(typeof(IPolicyRetriever), webHttpBinding, "").Behaviors.Add(webHttpBehavior);
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpsGetEnabled = true;
            host.Description.Behaviors.Add(smb);
            host.Open();
            Console.WriteLine("Host opened");
        }

さらに、GetSilverlightPolicy()関数に次の変更を加えました。

                     public Stream GetSilverlightPolicy()
        {
            string result =
                @"<?xml version=""1.0"" encoding=""utf-8""?>
                    <access-policy>
                        <cross-domain-access>
                            <policy>
                                <allow-from http-request-headers=""SOAPAction"">
                                    <domain uri=""https://""/>
                                    <domain uri=""http://""/>
                                </allow-from>
                                <grant-to>
                                    <resource path=""/"" include-subpaths=""true""/>
                                </grant-to>
                            </policy>
                        </cross-domain-access>
                    </access-policy>";
            return StringToStream(result);
        }
于 2012-11-16T14:31:25.197 に答える
1

デフォルトでは、Silverlightクライアントは、.XAPファイルが読み込まれたドメイン以外のドメインにネットワーク要求を行うことはできません(つまり、クロスドメイン要求)。自己ホスト型のWCFサービス(Xドメイン要求を意味する)にアクセスする場合、サービスは、そのような要求が行われても問題がないことを示すポリシーファイルをSilverlightランタイムに提供する必要があります。

セルフホストサービスのクロスドメイン呼び出しを有効にする方法の例は、http://blogs.msdn.com/b/carlosfigueira/archive/2008/03/07/enabling-cross-domain-の投稿にあります。 calls-for-silverlight-apps-on-self-hosted-web-services.aspx。サービスはHTTPSを使用するため、HTTPSを使用してポリシーを提供する必要がありますが、それ以外の場合は、投稿のコードが機能するはずです。

于 2012-09-11T16:45:06.060 に答える