我遇到了一个奇怪的问题:我正在构建的 WCF Web 服务在调试模式下运行,但不是在发布模式下运行。
我在 Web 服务中有一个简单的 Hello Web 方法,它只返回一个字符串,不做任何其他事情(没有日志记录、异常处理,什么都不做)。我从 Visual Studio 中运行 WCFTestClient,方法是选择 .svc 文件并单击 F5 开始调试。当 WCFTestClient 打开时,我双击 Hello Web 方法并调用它。在调试模式下它运行良好。在发布模式下,我几乎立即收到以下错误:
Object reference not set to an instance of an object.
Server stack trace:
at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at IVehicleRisk.Hello()
at VehicleRiskClient.Hello()
(Web 服务是 VehicleRisk.svc,服务合同是 IVehicleRisk)。
向应用程序添加断点当我调用 Hello Web 方法时,我可以看到 Global.asax.cs 中的 Application_BeginRequest 方法正在被调用(它是一个空方法)。当抛出异常时,无论是在构造函数还是 Hello 方法中,都不会命中 VehicleRisk.svc.cs 中的断点(当 Web 方法工作时,会命中断点)。
我查看了 Visual Studio 中的项目构建属性(右键单击解决方案资源管理器中的项目,选择属性,在属性窗口中打开构建选项卡)。我可以看到调试和发布模式之间的唯一区别是:
定义 DEBUG 常量:在 Debug 模式下设置为 on,在 Release 中设置为 off;
优化代码:在Debug模式下开启,在Release模式下开启;
高级 > 输出调试信息:在 Debug 模式下设置为 full,在 Release 中设置为 pdb-only。
尝试在发布模式下更改构建属性,我发现只有在优化代码设置为关闭并且高级>输出调试信息设置为完整时,我才能使 web 方法工作。将 DEBUG 常量设置为 on 或 off 没有区别。
有谁知道为什么打开代码优化或将调试信息设置为仅 pcb 时简单的 Web 方法会失败?