我有一个 Silverlight 应用程序,我想在其中调用 WCF 服务。调用服务时,我从服务器收到以下响应:
415 无法处理消息,因为内容类型为 'text/xml; charset=utf-8' 不是预期的类型 'application/soap+xml; 字符集=utf-8
有没有人遇到过这个问题?有谁知道我需要调整哪些配置设置?任何有关如何解决此问题的信息将不胜感激。
我有一个 Silverlight 应用程序,我想在其中调用 WCF 服务。调用服务时,我从服务器收到以下响应:
415 无法处理消息,因为内容类型为 'text/xml; charset=utf-8' 不是预期的类型 'application/soap+xml; 字符集=utf-8
有没有人遇到过这个问题?有谁知道我需要调整哪些配置设置?任何有关如何解决此问题的信息将不胜感激。
那么,您可以尝试在VS2008中使用“Silverlight-enabled WCF Service”模板,并比较差异?我希望您需要使用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 服务时遇到此错误。
根本原因是 WCF 服务是使用 wsHttpBinding 绑定的,而 Silverlight 仅支持 basicHttpBinding。
因此,请检查<bindings>
web.config 中的元素,并确保服务的绑定信息在元素中<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 服务上的任何方法中更改响应的内容类型。
作为示例,以下代码显示了如何使用此类将内容类型设置为 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 的一部分。
希望这可以帮助。