WCF 服务客户端应用程序获取“对象未设置为对象的实例”

Posted

技术标签:

【中文标题】WCF 服务客户端应用程序获取“对象未设置为对象的实例”【英文标题】:WCF service client application getting "Object not set to an instance of an object" 【发布时间】:2012-06-23 23:09:23 【问题描述】:

刚刚使用 IIS 7.5 在我公司的服务器上部署了我的 WCF 服务,一切似乎都运行良好。但是当我设置我的客户端应用程序并添加对服务器的服务器引用然后使用此代码时。

ServerReference.ServiceClient client = new ServerReference.ServiceClient();

var s = client.GetBrand("Audi", false);

我得到一个异常,说“对象引用未设置为对象的实例”。 s 对象不应为空(我们在 localhost 上尝试了该服务,我们将其全部放在它工作的同一个项目中)。

您查看了 stackstrace,它看起来像这样。

21.6.2012 16:16:29

对象引用未设置为对象的实例。

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)

有什么建议吗?? P.S 托管 WCF 服务的 CPU 没有 Visual Studio,所以我无法通过它进行调试

【问题讨论】:

WcfTestClient 是否适用于托管服务?缩小范围以查看它是您的实现,还是服务未能初始化。合同也可能已更改(取决于您上次获取元数据的时间)可能导致服务无法实例化。 【参考方案1】:

正如我在评论中建议的那样,请确保您可以使用 WcfTestClient 获取数据。这既确认了服务正在运行,又几乎对方法调用进行了单元测试,以确保它从客户端的角度工作。

其次,(除非您将其淡化以在 SO 上发布)使用 correct WCF call method 来避免此类问题。引入依赖项后,预测失败总是一个好主意(尽管是您的服务、客户端的 Internet 连接或其他)。

如果对您的项目一无所知,很难描述如何修复它。诸如旧 WSDL、错误配置的 *.config、服务器上未公开的端点以及其他问题等因素可能是问题的根源,但鉴于您所展示的内容,我不知道它可能是什么。

如果您能提供更多信息,我很乐意用我可能有的任何更多建议来更新我的答案。现在,看看服务器上的enabling WCF tracing,这样您就可以回顾日志,看看服务器端是否有任何问题(除了单步执行客户端的调用和检查之外)。

【讨论】:

WCF 跟踪目前正在工作(不太明白为什么)...根据我的研究,今天的研究与绑定有关。我注意到并觉得有趣的一件事是,当我使用测试客户端并调用本地主机上的服务并使用空参数调用它时,它返回与 IIS 托管服务相同的错误(每个参数)。这是要考虑的事情吗,ps 还有什么你想让我在这里发帖以更好地理解【参考方案2】:

您不必通过它进行调试。只需在 web.config 中添加 WCF 跟踪设置,您就可以获得有关原始错误的信息。见http://msdn.microsoft.com/en-us/library/ms733025.aspx

【讨论】:

复制代码并将其放入我的 webconfig 中,但什么也没发生。没有创建文件或类似的东西 您是否在具有不同身份的应用程序池中运行 WCF 服务?如果是这样,您需要确保它对相关目录具有完全控制权限。我认为使用 Information 级别的跟踪,您可以通过浏览服务进行测试,您可能需要 Verbose 级别。【参考方案3】:

我在我的项目中遇到了同样的问题,在我的例子中,我发现异常发生在服务构造函数中,但它只在我调用任何方法时触发。

【讨论】:

【参考方案4】:

配置跟踪源以发出跟踪和设置跟踪级别,设置活动跟踪和传播以支持端到端跟踪关联,并设置跟踪侦听器以访问跟踪。

Windows Communication Foundation (WCF) 为诊断跟踪输出以下数据: 跨应用程序的所有组件跟踪流程里程碑,例如操作调用、代码异常、警告和其他重要的处理事件。 跟踪功能出现故障时的 Windows 错误事件。见Event Logging in WCF。

【讨论】:

以上是关于WCF 服务客户端应用程序获取“对象未设置为对象的实例”的主要内容,如果未能解决你的问题,请参考以下文章

WCF 服务而不是 ASMX Web 服务?

WCF学习——构建一个简单的WCF应用

wcf客户端怎么获取自身使用的端口号?

从第三方 WCF 获取底层异常 - SOAP 异常

重用 WCF 服务客户端

WCF 客户端代理初始化