gpt4 book ai didi

.net - WCF 服务在 Debug模式下运行,但不在 Release模式下运行

转载 作者:行者123 更新时间:2023-12-02 05:03:10 24 4
gpt4 key购买 nike

我遇到了一个奇怪的问题:我正在构建的 WCF Web 服务在 Debug模式下运行但不是在 Release模式下运行。

我在 Web 服务中有一个简单的 Hello Web 方法,它只返回一个字符串,什么都不做(没有日志记录、异常处理,什么都不做)。我通过选择 .svc 文件并单击 F5 开始调试,从 Visual Studio 中运行 WCFTestClient。当 WCFTestClient 打开时,我双击 Hello Web 方法并调用它。在 Debug模式下它运行良好。在 Release模式下,我几乎立即收到以下错误:

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,服务契约(Contract)是 IVEhicleRisk)。

向应用程序添加断点 我可以看到,当我调用 Hello Web 方法时,正在调用 Global.asax.cs 中的 Application_BeginRequest 方法(它是一个空方法)。当抛出异常时,无论是在构造函数还是 Hello 方法中,都不会命中 VehicleRisk.svc.cs 中的断点(当 web 方法工作时,会命中断点)。

我查看了 Visual Studio 中的项目构建属性(右键单击解决方案资源管理器中的项目,选择“属性”,在“属性”窗口中打开“构建”选项卡)。我在调试和 Release模式之间看到的唯一区别是:

  1. 定义DEBUG常量:Debug模式下开启,Release模式下关闭;

  2. 优化代码:Debug模式关闭,Release模式开启;

  3. Advanced > Output Debug Info:在 Debug 模式下设置为 full,在 Release 模式下设置为 pdb-only。

在 Release 模式下尝试更改 Build 属性,我发现只有在关闭优化代码并将 Advanced > Output Debug Info 设置为 full 时,我才能让 web 方法工作。将 DEBUG 常量设置为开或关没有区别。

有没有人知道为什么一个简单的 web 方法会在代码优化打开时或调试信息设置为 pcb-only 时失败?

最佳答案

如果没有看到您的代码,很难说出哪里出了问题。

为了重新创建一个可以正常工作的示例项目,我创建了一个具有以下服务接口(interface)的 WCF 服务应用程序:

using System.ServiceModel;

namespace HelloWCF
{
[ServiceContract]
public interface IHelloService
{
[OperationContract]
string SayHello(string name);
}
}

然后我用下面的类实现了这个接口(interface):

namespace HelloWCF
{
public class HelloService : IHelloService
{
public string SayHello(string name)
{
return string.Format("Hello, {0}", name);
}
}
}

我还在 <system.servicemodel> 添加了以下服务配置web.config 部分:

    <services>
<service name="HelloWCF.HelloService"
behaviorConfiguration="SimpleBehavior">
<endpoint
binding="basicHttpBinding"
contract="HelloWCF.IHelloService" />
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>

我还命名了服务行为:

<behaviors>
<serviceBehaviors>
<behavior name="SimpleBehavior">
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>

我使用 WCF 测试客户端在调试和 Release模式下构建并运行服务,它按预期工作: WCF Test Client

我还能够使用 IE (http://localhost:<port-number)/HelloService.svc) ping 服务,并且能够看到服务信息页面并访问其 MEX。

HTH.

关于.net - WCF 服务在 Debug模式下运行,但不在 Release模式下运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16702741/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com