MSDN へのリンクがたくさんあり、「私のマシンで動作します!」回答があるので、私がやっていることを再現するための正確な手順で質問したいと思います。私たちは既存の Web サービスを使用しているため、オンラインの多くのチュートリアルやビデオとは異なり、プロジェクトの外部で Web サービスをホストするというコンテキストで質問しています。だからここに行きます:
*** 新しい ASP.NET Web サービス プロジェクトを作成します。
「HelloWorld」Web メソッドを公開する既存の Service.asmx ファイルが付属しています。
ブラウザで表示し、「Invoke」ボタンを押します。「Hello World」文字列を返すように動作するはずです。
私のマシンでは、URL は " http://localhost:15511/WebSite5/Service.asmx "です。
*** Visual Studio の新しいインスタンスを開始し、Silverlight Web アプリケーション プロジェクトを作成します。
*** Web サービスを呼び出すためのイベント ハンドラーでボタンを 1 つ貼り付けます。私は個人的に Grid を nuke し、単純な StackPanel を使用します。例えば。
<UserControl x:Class="SilverlightApplication1.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<StackPanel>
<Button Click="Button_Click">
<Button.Content>
<TextBlock Text="Test"/>
</Button.Content>
</Button>
</StackPanel>
</UserControl>
Button_Click のステートメントとイベント ハンドラーを使用して、Web 参照を追加します。
private void Button_Click(object sender, RoutedEventArgs e)
{
ServiceSoapClient client = new ServiceSoapClient();
client.HelloWorldCompleted += (object s, HelloWorldCompletedEventArgs ea) => {
MessageBox.Show(ea.Result);
};
client.HelloWorldAsync();
}
- Silverlight アプリケーションを実行します。私の場合、次の Silverlight テスト ページに移動します: http://localhost:15558/SilverlightApplication1TestPage.aspx
実行すると、もちろん、クロスドメインの問題のために爆発します。次に、次のようにclientaccesspolicy.xmlファイルを、サービスをホストする Web アプリケーションのルートに追加します。
<?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 include-subpaths="true" path="/"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
ヘッダー、URI、およびリソースのワイルドカードがあるため、これで問題が解決するはずですよね?
- もう一度実行すると、エラーが発生します。
URI ' http://localhost:15511/WebSite5/Service.asmx ' への要求の試行中にエラーが発生しました。これは、適切なクロスドメイン ポリシーを設定せずにクロスドメイン方式でサービスにアクセスしようとしたか、SOAP サービスに適していないポリシーが原因である可能性があります。クロスドメイン ポリシー ファイルを公開し、SOAP 関連の HTTP ヘッダーを送信できるようにするために、サービスの所有者に連絡する必要がある場合があります。
質問: clientaccesspolicy ファイルに秘密はありますか? 代わりに crossdomain.xml を試すこともできますが、同様の結果が得られます。