私は奇妙な問題に直面しました: 私が構築している WCF Web サービスはデバッグ モードで実行されますが、リリースでは実行されません。
文字列を返すだけで他に何もしない (ロギングも例外処理も何もしない) Web サービスに単純な Hello Web メソッドがあります。.svc ファイルを選択し、F5 をクリックしてデバッグを開始することにより、Visual Studio 内から WCFTestClient を実行します。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 メソッドが呼び出されていることがわかります (これは空のメソッドです)。例外がスローされたとき、VehicleRisk.svc.cs のブレークポイントは、コンストラクターでも Hello メソッドでもヒットしていません (Web メソッドが機能している場合、ブレークポイントはヒットしています)。
Visual Studio でプロジェクトのビルド プロパティを確認しました (ソリューション エクスプローラーでプロジェクトを右クリックし、[プロパティ] を選択して、[プロパティ] ウィンドウの [ビルド] タブを開きます)。デバッグ モードとリリース モードの唯一の違いは次のとおりです。
DEBUG 定数を定義します。デバッグ モードではオンに設定し、リリース モードではオフに設定します。
コードの最適化: デバッグ モードではオフに設定し、リリースではオンにします。
Advanced > Output Debug Info: デバッグ モードでは full に設定し、リリースでは pdb-only に設定します。
リリース モードでビルド プロパティを変更して実験したところ、コードの最適化がオフに設定され、[詳細設定] > [デバッグ情報を出力] が完全に設定されている場合にのみ Web メソッドが機能することがわかりました。DEBUG 定数をオンまたはオフに設定しても違いはありません。
コードの最適化がオンになっているとき、またはデバッグ情報が pcb-only に設定されているときに、単純な Web メソッドが失敗する理由を知っている人はいますか?