[英]Configure WCF to send requests in text/xml and recieve application/soap+xml responses
[英]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服務調用。
要查看異常消息,請在服務調用周圍添加try-catch,並在catch塊中設置斷點。 這將允許您檢查異常內容。 您可能希望臨時配置服務以在故障消息中包含異常詳細信息 。
您可以通過為服務啟用消息日志記錄來輕松跟蹤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.