【问题标题】:WCF Silverlight service returns custom fault but as HTTP 500 response not 200WCF Silverlight 服务返回自定义错误,但 HTTP 500 响应不是 200
【发布时间】:2011-08-13 18:30:02
【问题描述】:

似乎我一直在为我的 Silverlight WCF 服务中的自定义错误而烦恼,所以我很乐意尽我所能为任何可以帮助我解决此问题的人购买啤酒! !

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

我知道我的 SilverlightFaultBehavior 类应该负责更改响应状态代码,但我在那里设置的断点永远不会被命中,所以我希望这是一个简单的 web.config 问题(web.config在帖子末尾)。

如果这是相关的,我的 web.config 会显示“元素 'behavior' 具有无效的子元素 '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)
        {

【问题讨论】:

    标签: silverlight wcf http-status-codes


    【解决方案1】:

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

    在阅读了该死的手册并逐字执行后,我感到如此悲伤,这真是太糟糕了。最后我的配置解析错误“元素'行为'有无效的子元素'silverlightFaults'......”是无关紧要的,但是一路上非常臭的红鲱鱼很可能是原因(并且仍然可能是)。

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

    【讨论】:

    • 不适合我(nettcp silverlight+nettcp binding + wcf)(((
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2012-05-05
    相关资源
    最近更新 更多