簡體   English   中英

Silverlight + WCF異常:期待application / soap + xml,收到text / xml

[英]Silverlight+WCF exception: Expecting application/soap+xml, received text/xml

我有一個Silverlight應用程序,我想在其中調用WCF服務。 在調用服務時,我從服務器收到以下響應:

415無法處理消息,因為內容類型為'text / xml; charset = utf-8'不是預期的類型'application / soap + xml; 字符集= utf-8的

以前有沒有人遇到過這個問題? 有誰知道我需要調整哪些配置設置? 任何有關如何解決這個問題的信息將不勝感激。

那么,您可以嘗試使用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>

嘗試將Silverlight應用程序連接到WCF服務時遇到此錯誤。

根本原因是使用wsHttpBinding綁定了WCF服務,而Silverlight僅支持basicHttpBinding。

因此,請檢查web.config中的<bindings>元素,並確保服務的綁定信息位於<basicHttpBinding>元素中,並且服務定義的<endpoint>元素使用basicHttpBinding。

可能該服務正在拋出異常。 異常消息不是服務調用所期望的格式,因此是“非預期類型”消息。

如果調用的方法沒有在內部拋出異常,請根據Marc Gravell的有用答案檢查服務或其他配置項的安全設置。

有兩種方法可以檢查異常:詳細查看異常消息,或跟蹤WCF服務調用。

  1. 要查看異常消息,請在服務調用周圍添加try-catch,並在catch塊中設置斷點。 這將允許您檢查異常內容。 您可能希望臨時配置服務以在故障消息中包含異常詳細信息

  2. 您可以通過為服務啟用消息日志記錄來輕松跟蹤WCF消息。 您可以在配置文件中執行此操作(請參閱配置消息日志記錄 )或使用WCF服務配置編輯器(可在VS 2008工具菜單下或右鍵單擊配置文件)。 然后使用服務跟蹤查看器瀏覽日志文件。 查看器是SDK的一部分,可以在此處找到: "C:\\Program Files\\Microsoft SDKs\\Windows\\v6.0A\\bin\\SvcTraceViewer.exe"

您可以使用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的一部分。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM