WCF Silverlight服务返回自定义错误,但HTTP 500响应不是200

时间:2011-08-13 18:30:02

标签: silverlight wcf http-status-codes

似乎我一直在为我的Silverlight WCF服务中的自定义故障敲打我的头,所以我很高兴尽我所能买啤酒给任何可以帮我解决这个问题的人! !

经过多次痛苦后我终于让我的WCF服务抛出自定义错误(ParameterValidationFault)并使用Fiddler我知道服务的响应包含我的序列化错误对象,但HTTP响应代码是500而不是200,所以客户端开始抛出异常而不是阅读响应。

我知道我的SilverlightFaultBehavior类应该注意更改响应状态代码,但是我设置的断点永远不会被命中,所以我希望这是一个简单的web.config问题(web .config结束时。)

如果这是相关的,我的web.config显示“元素'行为'具有无效的子元素'silverlightFaults'...”,在

部分中
  <endpointBehaviors>
    <behavior name="SilverlightFaultBehavior">
      <silverlightFaults/>
    </behavior>
  </endpointBehaviors>

但我认为这不是问题,因为我可以毫无错误地查看服务的元数据。但是现在我认为这是一个缺少的链接,它阻止我的状态代码在出路时被更改。我已经读过这个错误表明我的behaviorExtension元素中的type属性不完全匹配.NET认为它应该是什么,但是我已经检查了一百万次,命名空间和程序集名称肯定是正确的。我没有弄乱版本,文化或公钥。

.NET是否有一种简单的方法可以告诉我这个类型字符串应该是什么(空格,逗号和所有字符串)?我已经在资源管理器中查看了dll的属性,但我仍然没有接近。

关于这可能来自哪里的任何其他建议将非常感激。

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <extensions>
      <behaviorExtensions>
        <add name="silverlightFaults" type="my.namespace.SilverlightFaultBehavior, AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
      </behaviorExtensions>
    </extensions>
    <behaviors>
      <endpointBehaviors>
        <behavior name="SilverlightFaultBehavior">
          <silverlightFaults/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <customBinding>
        <binding name="my.namespace.IService.customBinding0">
          <binaryMessageEncoding />
          <httpTransport />
        </binding>
      </customBinding>
    </bindings>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
      <service name="my.namespace.IService">
        <endpoint address="" binding="customBinding" bindingConfiguration="my.namespace.IService.customBinding0" contract="my.namespace.IService" behaviorConfiguration="SilverlightFaultBehavior" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>
</configuration>

我的SilverlightFaultBehavior类以这样的方式启动,并且是this MSDN post的复制粘贴,其名称空间更改

namespace my.namespace
{
    public class SilverlightFaultBehavior : BehaviorExtensionElement, IEndpointBehavior
    {
        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {

1 个答案:

答案 0 :(得分:0)

好的,所以这个问题还没有解决,但解决了问题。我终于在this very useful post看到我可以匿名endpointBehavior。现在应用该行为,并且自定义错误正确(以非标准方式)作为HTTP 200s返回。使行为匿名意味着它应用于所有端点,但由于我的服务目前只需要一个端点,这对我有用。

在阅读friggin手册并逐字实施之后,我真的很难过。最后我的配置解析错误“元素'行为'具有无效的子元素'silverlightFaults'......”是无关紧要的,但是一路上非常臭的红鲱鱼因为它很可能是原因(并且仍然可能)定)。

如果有人想知道,我只是喝了啤酒。