私は、MSDNへの多くのリンクを見て、「自分のマシンで動作します!」答えなので、私がしていることを複製するための正確な手順で質問をしたいと思います。私たちは既存のWebサービスを使用しているため、オンラインのチュートリアルやビデオの多くとは異なり、プロジェクトの外部でWebサービスをホストするというコンテキストについて質問しています。だからここに行く:
***新しいASP.NET Webサービスプロジェクトを作成します。
「HelloWorld」Webメソッドを公開する既存のService.asmxファイルが付属します。
ブラウザで表示し、「呼び出し」ボタンをクリックします。 「Hello World」文字列を返すように動作するはずです。
私のマシンでは、URLは「 http:// localhost:15511/WebSite5/Service.asmx "
*** Visual Studioの新しいインスタンスを開始し、Silverlight Webアプリケーションプロジェクトを作成します。
*** Webサービスを呼び出すためのイベントハンドラーを1つのボタンに貼り付けます。私は個人的にグリッドを核にして、単純な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();
}
実行すると、クロスドメインの問題が原因で当然爆発します。したがって、次に、サービスをホストしているWebアプリケーションのルートに、次の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 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を試すこともできますが、同様の結果が得られます。
私はこれと同じ問題を数回経験しました。これまでは、起動時にWebアプリを使用してこれを解決しましたが、既にそれを実行しているようです。
この件に関する私の投稿: http://www.donnfelker.com/silverlight-cross-domain-issue/
私はこの問題(SL v5.0およびVisual Studio 2010)に遭遇しましたが、それを修正したのは、Silverlightプロジェクトのプロパティ>> Silverlightタブに移動し、[ブラウザーで実行するときに管理者特権を要求する]を選択したことです。
Clientaccesspolicy.xmlファイルをIIS Webディレクトリのルートに配置してください。
C:\ Inetpub\wwwroot\clientaccesspolicy.xml
これにより、http:///clientaccesspolicy.xmlから直接アクセスできるようになります。
同じエラーが発生し、上記の手順を実行して解決しました。
私にとってうまくいったことは、私がSilverlightフォーラムで見つけたものから始まりました here 。それは本質的に私ができるかどうか尋ねました get localhost(http://localhost/clientaccesspolicy.xml)からclientaccesspolicy.xmlまたはcrossdomain.xmlに変更します。私がそこに移動しようとしたとき、私はそれらの両方のコードを見つけることができなかったので(前述のスレッド内でも)、inetpub\wwwroot \ディレクトリ( Notepad ++を使用して開いた)。奇妙な部分は コードはまったく変更されませんでした 、それでも動作します!それが誰かを助けることを願っています!これは非常に奇妙でした。
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>
crossdomain.xml
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
恵まれる!
-sf
多分あなたのServiceReferences.ClientConfig
Silverlightクライアントが間違ったURLを指していますか?
また、クロスドメインポリシーファイルの場所を確認してください。この MSDN記事 に詳細情報があります。
Silverlightをローカルで実行するための追加のメモ(Vistaサイドバーなど)。 このブログエントリ 、で報告されているように、「Silverlightはローカルで実行している場合、ネットワークプロバイダーを使用できません。」回避策は、この状況でWebサービスにインターフェースするJavaScript。
プロジェクト内のサービスを参照すると、ファイル「Reference.ClienConfig」が作成され、次のようになるという状況に注意する必要があります。
**
<endpoint address="http://localhost:57675/Servis.asmx" binding="basicHttpBinding"
bindingConfiguration="ServisSoap" contract="ServiceReference1.ServisSoap"
name="ServisSoap" />
**
ページがまだ同じポートを使用していることを確認してください(たとえば、57675)。デフォルトでは、ローカルホストはランダムなポートを取得するため、動的ではなく静的な番号に変更する必要があります。 (asp.netプロジェクト/タブWeb /特定のポート/タイプ番号を右クリックしてください)
fiddler を試してみましたか?IEを使用してこれを使用すると、Silverlightが引き起こしているトラフィック(たとえば、探しているクロスポリシーファイルなど)を確認できる場合があります。
Internet Explorerの設定を変更しました。このWebサイトはインターンWebサーバーで実行されるため、Iexplorerの信頼済みサイトリストに追加しました。 (ツール->インターネットオプション->セキュリティ->サイト)。
次に、セキュリティレベルを変更し、クロスドメインを有効にしました。完了しましたが、解決策を見つけるまでに時間がかかりました。
ベスト、ジェッペン
問題は、開発サーバーがxmlファイルを提供できないことです。これを試してください-WebGetを介して明示的に使用可能にします
[ServiceContract]
public interface ICrossDomainService
{
[OperationContract]
[WebGet(UriTemplate = "ClientAccessPolicy.xml")]
Message ProvidePolicyFile();
}
次に、ProvidePolicyFile()を
public System.ServiceModel.Channels.Message ProvidePolicyFile()
{
FileStream filestream = File.Open(@"ClientAcessPolicy.xml", FileMode.Open);
// Either specify ClientAcessPolicy.xml file path properly
// or put that in \Bin folder of the console application
XmlReader reader = XmlReader.Create(filestream);
System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);
return result;
}
私はこのようなものに出くわし、ServiceHostFactoryを追加すると問題が解決しました。クロスドメインポリシーファイルだけでは修正されませんでした。
class MyHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
MyHost customServiceHost =
new MyHost(serviceType, new Uri("[Your URL goes here]",UriKind.Absolute));
return customServiceHost;
}
}
class MyHost : ServiceHost
{
public MyHost(Type serviceType, params Uri[] baseAddresses) base(serviceType, baseAddresses)
{ }
protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
}
}
また、サービスを定義するタグにFactory = "MyHostFactory"を追加する必要があります
それは私のPCでうまくいきました、あなたはあなたを置くことができます
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>
プロジェクトディレクトリとwebservicesルートの両方。
私は同じ問題に直面しており、問題を理解するのに3日以上かかりました。また、別のWebサーバーでホストされているSilverlightアプリからインターネットクラウドサービスWCFを呼び出しているときに、クロスドメインエラーが表示されるだけであることに気付きました。いくつかの投稿を調べた後、問題を解決できませんでした。サービスのルートディレクトリにcross-domain.xmlファイルとclientaccesspolice.xmlファイルを配置しました。したがって、私は http://example.com を使用する代わりに、安全な https://example.com に変更するだけで、問題なく動作しました。クロスドメインエラーは表示されなくなります。サービスは問題なく呼び出されました。