我有一个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中查看)和浏览器的日志控制台。这使故障排除更容易。