1

ASP Azure Web ロールでホストされている Silverlight 4 アプリがあります。Web ロールは、WCF サービスを公開します。(これらはすべて、同じ Visual Studio ソリューションにあります。)

サービスへの参照を正常に追加し、クライアント コードを生成しました。ただし、エラーが発生します。

ExpenseServiceClient service = new ExpenseServiceClient();
service.GetExpensesCompleted += new EventHandler<GetExpensesCompletedEventArgs>(service_GetExpensesCompleted);
service.GetExpensesAsync();

コールバック:

    static void service_GetExpensesCompleted(object sender, GetExpensesCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            MessageBox.Show(e.Error.ToString());
            return;
        }

        // ...
    }

e.エラーは次のとおりです。

{System.ServiceModel.CommunicationException: URI 'http://localhost:88/ExpenseService.svc' への要求を試行中にエラーが発生しました。これは、適切なクロスドメイン ポリシーを設定せずにクロスドメイン方式でサービスにアクセスしようとしたか、SOAP サービスに不適切なポリシーが原因である可能性があります。クロスドメイン ポリシー ファイルを公開し、SOAP 関連の HTTP ヘッダーを送信できるようにするために、サービスの所有者に連絡する必要がある場合があります。このエラーは、InternalsVisibleToAttribute 属性を使用せずに Web サービス プロキシで内部型を使用した場合にも発生する可能性があります。

詳細については、内部例外を参照してください。

---> System.Security.SecurityException --->
System.Security.SecurityException: Security error.
   at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
   at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState)
   at System.Net.Browser.AsyncHelper.<>c__DisplayClass2.<BeginOnUI>b__0(Object sendState)
   --- End of inner exception stack trace ---
   at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
   at System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)
   --- End of inner exception stack trace ---
   at System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
   at System.ServiceModel.ClientBase`1.ChannelBase`1.EndInvoke(String methodName, Object[] args, IAsyncResult result)
   at ExpenseCalc_SilverLight.ExpenseService.ExpenseServiceClient.ExpenseServiceClientChannel.EndGetExpenses(IAsyncResult result)
   at ExpenseCalc_SilverLight.ExpenseService.ExpenseServiceClient.ExpenseCalc_SilverLight.ExpenseService.IExpenseService.EndGetExpenses(IAsyncResult result)
   at ExpenseCalc_SilverLight.ExpenseService.ExpenseServiceClient.OnEndGetExpenses(IAsyncResult result)
   at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result)}   System.Exception {System.ServiceModel.CommunicationException}

これらは両方とも で実行されていlocalhostます。私は何を間違っていますか?

4

2 に答える 2

1

Silverlight は、"クロス ドメイン" と見なされる呼び出しを行うたびに ClientAccessPolicy.XML ファイルが存在することを期待します (そのように表現するとかなり厳密です)。それを設定しましたか?私は SL の専門家ではありませんが、このエラーは通常、ポリシー ファイルが存在しない場合に発生します。

簡単な方法は、サイトのルートに作成することです。つまり、 http://localhost/clientaccesspolicy.xml です。

かなり緩い「すべて許可」ファイルは次のようなものです。

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

より複雑なシナリオ (アーキテクチャによっては Azure で発生する可能性があります) では、要求に基づいてポリシーを動的に作成できるように、期待される XML を提供する IIS ハンドラーを作成できます。

このアプローチを採用することに決めた場合、このアプローチに関するリソースはたくさんありますが、それが問題であることを確認するために、最初に単純化することをお勧めします。

于 2010-10-11T15:38:55.067 に答える
0

SilverLight についてはよくわかりませんが、Azure ストレージを使用する SilverLight アプリのデプロイについて話しているときに、クロス ドメイン ポリシーについて言及したことがあります。私の Google foo は弱いですが、これらのリンクのいずれかを試してみてください。

于 2010-10-10T21:49:03.620 に答える