似乎我一直在为我的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)
{
答案 0 :(得分:0)
好的,所以这个问题还没有解决,但解决了问题。我终于在this very useful post看到我可以匿名endpointBehavior
。现在应用该行为,并且自定义错误正确(以非标准方式)作为HTTP 200s返回。使行为匿名意味着它应用于所有端点,但由于我的服务目前只需要一个端点,这对我有用。
在阅读friggin手册并逐字实施之后,我真的很难过。最后我的配置解析错误“元素'行为'具有无效的子元素'silverlightFaults'......”是无关紧要的,但是一路上非常臭的红鲱鱼因为它很可能是原因(并且仍然可能)定)。
如果有人想知道,我只是喝了啤酒。