12

我有一个 Silverlight 应用程序,我想在其中调用 WCF 服务。调用服务时,我从服务器收到以下响应:

415 无法处理消息,因为内容类型为 'text/xml; charset=utf-8' 不是预期的类型 'application/soap+xml; 字符集=utf-8

有没有人遇到过这个问题?有谁知道我需要调整哪些配置设置?任何有关如何解决此问题的信息将不胜感激。

4

4 回答 4

9

那么,您可以尝试在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>
于 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

可能该服务正在引发异常。异常消息不是服务调用所期望的格式,因此是“不是预期的类型”消息。

如果调用的方法没有在内部引发异常,请根据 Marc Gravell 的有用答案检查服务或其他配置项的安全设置。

有几种方法可以检查异常:详细查看异常消息,或跟踪 WCF 服务调用。

  1. 要查看异常消息,请在服务调用周围放置一个 try-catch 并在 catch 块中设置断点。这将允许您检查异常内容。您可能希望临时配置服务以在故障消息中包含异常详细信息

  2. 通过为服务启用消息日志记录,您可以轻松地跟踪 WCF 消息。您可以在配置文件中执行此操作(请参阅配置消息日志)或使用 WCF 服务配置编辑器(在 VS 2008 工具菜单下或通过右键单击配置文件可用)。然后使用服务跟踪查看器浏览日志文件。查看器是 SDK 的一部分,可在此处找到:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\SvcTraceViewer.exe".

于 2009-01-29T23:21:59.427 回答
2

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

希望这可以帮助。

于 2009-01-30T12:27:54.830 回答