2011-09-12 12 views
1

SilverlightコードからWCF関数を実行しようとしました。 WCFはサイトwww.my-site.com上で動作しています Silverlightアプリケーションはサイトwww.my-site.comから<としてダウンロードされます。IFrame />サイトのwww.vkontakte.ruからダウンロードされるHTMLページの一部。私はa:ActionNotSupportedエラーを受け取りました。
どうしたのですか?ここでCrossdomain WCF - Silverlight構成エラーa:ActionNotSupported

は私のSilverlightアプリケーションによって送信された要求である。

POST http://www.my-site.com/MyService.svc HTTP/1.1
受け入れ:/
リファラー:http://www.my-site.com/ClientBin/MySlApp.xap
を-言語を受け入れ:RU-RU
のContent-Lengthを:153
コンテンツタイプ:text/xml;文字セット= UTF-8
のSOAPAction:、GZIPを
のUser-Agentを収縮させる: "http://tempuri.org/IMyService/Add"
は、エンコーディングを受け入れるのMozilla/5.0(互換; MSIE 9.0; Windows NTの6.1。トライデント/ 5.0)
ホスト:www.my-site.com
接続:キープアライブない-
プラグマ:キャッシュなしを

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
    <Add xmlns="http://tempuri.org/"> 
     <a1>1</a1> 
     <a2>1</a2> 
    </Add> 
    </s:Body> 
</s:Envelope> 

その結果、私はfolowing応答を受け取っています

HTTP /1.1 500内部サーバーエラー
キャッシュ制御:プライベート
コンテンツ長:710
コンテンツタイプ:application/xml;文字セット= UTF-8
サーバー:マイクロソフト-IIS/7.5
X-ASPNET-バージョン:4.0.30319
X-Poweredのバイ:ASP.NET
日:日、2011年9月11日十六時34分19秒GMT

<Fault xmlns="http://schemas.microsoft.com/ws/2005/05/envelope/none"> 
    <Code> 
    <Value>Sender</Value> 
    <Subcode> 
     <Value xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none"> 
     a:ActionNotSupported 
     </Value> 
    </Subcode> 
    </Code> 
    <Reason> 
    <Text xml:lang="en-US"> 
     The message with Action '' cannot be processed at the receiver, 
     due to a ContractFilter mismatch at the EndpointDispatcher. 
     This may be because of either a contract mismatch 
     (mismatched Actions between sender and receiver) 
     or a binding/security mismatch between the sender and the receiver. 
     Check that sender and receiver have the same contract and the same binding 
     (including security requirements, e.g. Message, Transport, None). 
    </Text> 
    </Reason> 
</Fault> 

Silverlightの要求コード:

 BasicHttpBinding basicHttpBinding = new BasicHttpBinding(); 
     EndpointAddress endpointAddress = 
      new EndpointAddress("http://www.my-site.com/MyService.svc"); 
     IDbService service = 
      new ChannelFactory<IDbService>(basicHttpBinding, endpointAddress) 
       .CreateChannel(); 
     AsyncCallback asy = delegate(IAsyncResult result) 
           { 
            Trace.WriteLine(service.EndAdd(result)); 
           }; 
     service.BeginAdd(1, 1, asy, null); 

Silverlightの操作コントラクトインターフェイス:

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract(AsyncPattern = true)] 
    IAsyncResult BeginAdd(long a1, long a2, AsyncCallback callback, object state); 

    long EndAdd(IAsyncResult result); 
} 

WCF操作コントラクトインタフェース:

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    long Add(long a1, long a2); 
} 

WCFサービスコード:web.configファイルの

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class MyService: IMyService 
{ 
    public long Add(long a1, long a2) 
    { 
     return a1 + a2; 
    } 
} 

部:

<system.serviceModel> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name="MySlApp.Web.ServiceMyServiceAspNetAjaxBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
     <behavior name="MySlApp.Web.MyServiceAspNetAjaxBehavior"> 
     <enableWebScript /> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
     multipleSiteBindingsEnabled="true" /> 
    <services> 
    <service name="MySlApp.Web.DbService" 
      behaviorConfiguration="MySlApp.Web.ServiceMyServiceAspNetAjaxBehavior"> 
     <endpoint address="" 
      binding="webHttpBinding" contract="MySlApp.Web.IMyService" /> 
    </service> 
    </services> 
</system.serviceModel> 

clientaccesspolicy.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<access-policy> 
    <cross-domain-access> 
    <policy> 
     <allow-from http-request-headers="*"> 
     <domain uri="http://www.my-site.com" /> 
     <domain uri="http://www.vkontakte.ru" /> 
     <domain uri="http://*.vkontakte.ru" /> 
     <domain uri="http://www.vk.com" /> 
     <domain uri="http://*.vk.com" /> 
     </allow-from> 
     <grant-to> 
     <resource path="/" include-subpaths="true"/> 
     </grant-to> 
    </policy> 
    </cross-domain-access> 
</access-policy> 

クロスドメイン。xml:

<?xml version="1.0" encoding="utf-8" ?> 
<cross-domain-policy> 
    <allow-access-from domain="www.my-site.com" /> 
    <allow-access-from domain="www.vkontakte.ru" /> 
    <allow-access-from domain="*.vkontakte.ru" /> 
    <allow-access-from domain="www.vk.com" /> 
    <allow-access-from domain="*.vk.com" /> 
</cross-domain-policy> 
+0

あなたはSilverlightのようにそれを作成しました互換性のあるWCFサービスまたは単純な古いWCFサービス? –

答えて

1

これはクロスドメインの問題ではありません。問題は、サーバエンドポイントがwebHttpBindingを使用している間に、basicHttpBindingに準拠するリクエストを送信していることです。 web.configを以下のリストに変更すると、それが動作するはずです。

<system.serviceModel> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name="MySlApp.Web.ServiceMyServiceAspNetAjaxBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
     multipleSiteBindingsEnabled="true" /> 
    <services> 
    <service name="MySlApp.Web.DbService" 
      behaviorConfiguration="MySlApp.Web.ServiceMyServiceAspNetAjaxBehavior"> 
     <endpoint address="" 
      binding="basicHttpBinding" contract="MySlApp.Web.IMyService" /> 
    </service> 
    </services> 
</system.serviceModel> 

サービスを変更できない場合は、クライアントを変更する必要があります。 webHttpBinding WCF WebHttpエンドポイントとも呼ばれるエンドポイント、または(何らかの形で 'REST'という用語を使用している)WCF RESTエンドポイントは、WCFプログラミングモデル(クライアントクラスChannelFactory<T>など)を使用してSL経由で直接アクセスすることはできません。ほとんどの人がこれらのサービスを消費するために、このようなWebClientHttpWebRequestなどの単純なクラスを使用します((ポストについてconsuming REST/POX services via SL、およびconsuming REST/JSON services via SLについての記事を参照してください)行うことができますが、それはあまりにも簡単なものではありません。

関連する問題