質問
MSDNへの多くのリンクを見て、<!> quot;私のマシンで動作します!<!> quot;答えがあるので、私がやっていることを複製するための正確な手順で質問をしたいと思います。既存のWebサービスを使用しているため、多くのオンラインチュートリアルやビデオとは異なり、Webサービスをプロジェクトの外部でホストするというコンテキストを求めています。だからここに行きます:
***新しいASP.NET Webサービスプロジェクトを作成します。
<!> quot; HelloWorld <!> quot;を公開する既存のService.asmxファイルが付属します。 Webメソッド。
ブラウザで表示して、<!> quot; Invoke <!> quot;を押します。ボタン。 <!> quot; Hello World <!> quot;を返すと動作するはずです。文字列。
私のマシンでは、URLは<!> quot; http:// localhost:15511 / WebSite5です。 /Service.asmx <!> quot;
*** 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();
}
- 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を試すこともできますが、同様の結果が得られます。
解決
この問題は何度か発生しました。過去に、起動時にWebアプリを使用してこれを解決しましたが、既にそれを行っているようです。
このテーマに関する私の投稿: http://www.donnfelker.com/ silverlight-cross-domain-issue /
他のヒント
この問題(SL v5.0およびVisual Studio 2010)に遭遇しましたが、それを修正したのは、Silverlightプロジェクトプロパティ<!> gt; <!> gt;に移動したことです。 [Silverlight]タブと選択された<!> quot;ブラウザー内で実行する場合は信頼を高める必要があります<!> quot;
clientaccesspolicy.xmlファイルをIIS Webディレクトリのルートに配置したことを確認してください。例:
C:\ Inetpub \ wwwroot \ clientaccesspolicy.xml
これにより、http:///clientaccesspolicy.xmlから直接アクセスできるようになります
同じエラーが発生し、上記の手順を実行して解決しました。
クライアント構成
SilverlightクライアントのServiceReferences.ClientConfig
が間違ったURLを指しているのでしょうか?
また、クロスドメインポリシーファイルの場所を確認します。この MSDNの記事には詳細が記載されています。
Silverlightをローカルで実行
Silverlightをローカルで実行するための追加メモ(Vista Sidebarなど)。 このブログエントリで報告されているように、 <!> quot; Silverlightでは使用できませんネットワークプロバイダー、ローカルで実行する場合。<!> quot; 回避策は、この状況でjavascriptを使用してWebサービスに接続することです。
私のために働いたものは、silverlightフォーラムこちらで見つけたものから始まりました。基本的に、localhost(http://localhost/clientaccesspolicy.xml)からclientaccesspolicy.xmlまたはcrossdomain.xmlに get できるかどうかを尋ねました。そこにナビゲートしようとしたとき、両方のコードを見つけて(前述のスレッド内でも)、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
IEでこれを使用するときにフィドラーを試した場合、トラフィックを確認できる可能性があります。探しているクロスポリシーファイルなど、silverlightが原因です。
Internet Explorerの設定を変更しました。 WebサイトはインターンWebサーバーで実行されるため、Iexplorerの信頼済みサイトリストに追加しました。 (ツール-<!> gt;インターネットオプション-<!> gt;セキュリティ-<!> gt;サイト)。
その後、セキュリティレベルを変更し、クロスドメインを有効にしました。完了しましたが、解決策を見つけるまでに時間がかかりました。
最高、 ジェペン
プロジェクト内でサービスを参照するときに、ファイル<!> quot; Reference.ClienConfig <!> quot;が作成される状況に注意する必要があります。あります:
**
<endpoint address="http://localhost:57675/Servis.asmx" binding="basicHttpBinding"
bindingConfiguration="ServisSoap" contract="ServiceReference1.ServisSoap"
name="ServisSoap" />
**
ページがまだ同じポートを使用していることを確認してください(たとえば、ここでは57675です)。デフォルトでは、localhostはランダムなポートを取得するため、動的ではなく静的な番号に変更する必要があります。 (asp.net project / Tab Web / Specific port / type numberを右クリックします 役に立てば幸いです
このようなことに遭遇し、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 = <!> quot; MyHostFactory <!> quot;も追加する必要があります。サービスを定義するタグ内
問題は、開発サーバーが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;
}
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>
プロジェクトディレクトリとWebサービスルートの両方。
私は同じ問題に直面しており、問題を理解するのに3日以上かかりました。また、別のWebサーバーでホストされているSilverlightアプリからInternet Cloud Service WCFを呼び出したときに、クロスドメインエラーが表示されるだけです。 いくつかの投稿を調べた後、問題を解決できませんでした。cross-domain.xmlおよびclientaccesspolice.xmlファイルをサービスルートディレクトリに配置しました。 http://example.com を使用する代わりに、安全な https://example.com で正常に機能しました。クロスドメインエラーが消えます。サービスは問題なく呼び出されました。
どのプロジェクトがデフォルトに設定されているかを確認します。 silverlightプロジェクトではなく、デフォルトに設定する必要があるのはWebプロジェクトです。