如何使ASP.NET Web服务器中抛出ServiceActivationException到浏览器?

时间:2011-01-20 15:15:07

标签: asp.net silverlight wcf exception-handling

我有一个Silverlight客户端使用WCF与Web服务器(当然是ASP.NET应用程序)交谈。

现在,当WCF安全设置与IIS中定义的安全设置不匹配时,通信当然也会失败。例如,虚拟目录的SSL设置可以指定要忽略客户端证书,但WCF配置可能需要客户端证书。这是一场冲突。尝试使用WCF从Silverlight客户端与Web服务器进行通信会生成NotSupportedException,后者将包含在IIS工作进程中引发的ServiceActivationException中:

System.NotSupportedException occurred
  Message=The SSL settings for the service 'SslRequireCert' does not match those of the IIS 'Ssl'.
  Source=System.ServiceModel.Activation
  StackTrace:
       at System.ServiceModel.Activation.HostedAspNetEnvironment.ValidateHttpsSettings(String virtualPath, Nullable`1& requireClientCertificate)
  InnerException: 

但是,此异常未传播到浏览器。在堆栈展开期间执行的一个catch语句(在方法HostedHttpRequestAsyncResult.BeginRequest中找到)检查http方法,如果不是,则GET完全吞下异常:

catch (ServiceActivationException exception)
{ 
  if (string.Compare(GetHttpMethod(), "GET", StringComparison.OrdinalIgnoreCase) == 0)
  {
    if (exception.InnerException is HttpException)
    { 
      throw exception.InnerException;
    } 
    else 
    {
      throw; 
    }
  }

  SetStatusCode((int)HttpStatusCode.InternalServerError); 
  SetStatusDescription(HttpChannelUtilities.StatusDescriptionStrings.HttpStatusServiceActivationException); 
  CompleteOperation(null); 
}

(我使用.NET Reflector跟踪执行情况)

现在,虽然原始异常包含非常准确的错误描述,但最终的异常绝对没用。

我的问题是有什么关系吗?是否可以使WCF使用GET方法?它有意义吗?如果它们被沿途吞噬,我们如何解决这类问题呢?

提前多多感谢。

EDIT1

我想强调一点,我没有在Web服务器端记录这些错误的问题。我利用@ServiceHost元数据的Factory属性来定义自定义ServiceHost类型,我可以在其OnOpen方法中记录错误。问题是我希望看到有意义的错误到达浏览器。

EDIT2

应该有一些背景。我需要能够解决登录失败问题。所有这些都在Web服务器日志中可见。但是,有时能够在客户端看到相同的错误非常方便,而无需请求Web服务器日志文件。因此,所有登录失败都输出到调试控制台(可在DbgView中查看)和浏览器的日志控制台。这使故障排除更容易。

0 个答案:

没有答案