12

WCF サービスを呼び出したい Silverlight アプリケーションがあります。サービスを呼び出すと、サーバーから次の応答を受け取ります。

415 コンテンツ タイプが 'text/xml; であるため、メッセージを処理できません。charset=utf-8' は、予期されたタイプ 'application/soap+xml;' ではありませんでした。文字セット=utf-8

以前にこの問題を経験した人はいますか? どの構成設定を調整する必要があるか知っている人はいますか? これを修正する方法に関する情報をいただければ幸いです。

4

4 に答える 4

9

VS2008 で「Silverlight 対応の WCF サービス」テンプレートを使用して、違いを比較してみてはいかがでしょうか。を使用する必要があり、basicHttpBindingよりエキゾチックなものを使用していると思います。

情報については、デフォルトの Silverlight/WCF サービスの web.config セクションを次に示します。

 <system.serviceModel>
  <behaviors>
   <serviceBehaviors>
    <behavior name="MySite.Service1Behavior">
     <serviceMetadata httpGetEnabled="true" />
     <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
   </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  <services>
   <service behaviorConfiguration="MySite.Service1Behavior"
       name="MySite.Service1">
    <endpoint address="" binding="basicHttpBinding"
       contract="MySite.Service1" />
    <endpoint address="mex" binding="mexHttpBinding"
       contract="IMetadataExchange" />
   </service>
  </services>
 </system.serviceModel>
于 2009-01-29T23:07:03.323 に答える
3

Silverlight アプリケーションを WCF サービスに接続しようとして、このエラーが発生しました。

根本的な原因は、WCF サービスが wsHttpBinding を使用してバインドされていたのに対し、Silverlight は basicHttpBinding のみをサポートしていることが判明しました。

その<bindings>ため、web.config 内の要素を確認し、サービスのバインディング情報が要素内<basicHttpBinding>にあること、および<endpoint>サービス定義の要素が basicHttpBinding を使用していることを確認してください。

于 2009-02-23T07:19:10.413 に答える
2

WebOperationContext クラスを使用して、WCF Web サービスの任意のメソッドで応答のコンテンツ タイプを変更できます。

例として、次のコードは、このクラスを使用して content-type を application/xml に設定し、UTF-8 でエンコードされたストリームを返す方法を示しています。

[ServiceContract]
public interface IPolicyProvider
{
    [OperationContract, WebGet(UriTemplate = "/ClientAccessPolicy.xml")]
    Stream ProvidePolicy();
}

public sealed class StockService : IPolicyProvider
{
    public Stream ProvidePolicy()
    {
        WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";
        return new MemoryStream( Encoding.UTF8.GetBytes(File.ReadAllText("ClientAccessPolicy.xml"))  , false);
    }
}

この例に興味がある場合は、セルフホステッド WCF Web サービスで Silverlight クライアントのクロスドメイン呼び出しを有効にすることを目的としています。詳細については、こちらを参照してください。この投稿にコードのダウンロードが添付されています。

あなたの状況では、WCF サービスからの応答に対して、コンテンツ タイプを application/soap+xml に設定し、UTF-8 を使用します。

WebOperationContext クラスは System.ServiceModel.Web アセンブリにあり、.NET Framework 3.5 の一部です。

お役に立てれば。

于 2009-01-30T12:27:54.830 に答える
2

おそらく、サービスが例外をスローしています。例外メッセージは、サービス コールが期待する形式ではないため、「期待されるタイプではありません」というメッセージが表示されます。

呼び出されたメソッドが内部的に例外をスローしていない場合は、Marc Gravell の役立つ回答に従って、サービスまたはその他の構成項目のセキュリティ設定を確認してください。

例外を調べるには、いくつかの方法があります。例外メッセージを詳細に調べるか、WCF サービス呼び出しをトレースします。

  1. 例外メッセージを表示するには、サービス呼び出しの周りに try-catch を置き、catch ブロックにブレークポイントを設定します。これにより、例外の内容を調べることができます。サービスを一時的に構成して、エラー メッセージに例外の詳細を含めることができます。

  2. サービスのメッセージ ログを有効にすると、WCF メッセージを簡単にトレースできます。これは、構成ファイル (「メッセージ ログの構成」を参照) で行うか、WCF サービス構成エディター (VS 2008 の [ツール] メニューから、または構成ファイルを右クリックして使用できます) を使用して行うことができます。次に、Service Trace Viewer を使用してログ ファイルを参照します。ビューアーは SDK の一部であり、次の場所にあります"C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\SvcTraceViewer.exe"

于 2009-01-29T23:21:59.427 に答える