代码之家  ›  专栏  ›  技术社区  ›  Rafe

帮助调试WCF

  •  1
  • Rafe  · 技术社区  · 14 年前

    默认情况下,来自您的错误。到目前为止,我遇到了以下问题,并且从VisualStudio或运行时基本上没有任何迹象表明有任何问题(除了我的应用程序不工作之外):

    • 服务引用不是最新的(为什么VS不自动执行此操作?);
    • 无法序列化服务方法中的类型;
    • 服务试图传递的数据超出了默认值所允许的范围。

    想必有一些简单的方法可以让这些问题对我这个开发人员可见。如果有人能告诉我这是什么,我会非常感激(几个小时的谷歌搜索没有提供一个有效的答案)!

    如果有人知道为什么WCF和WPF的默认行为是悄悄地隐藏这样的错误,我也会非常感激。至少可以说,这看起来很奇怪。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Ladislav Mrnka    14 年前

    我猜你对Web服务的基本概念理解有误。WCF是构建web服务的API。与RPC不同的是,Web服务应该独立使用。这意味着您可以在不知道将使用它的应用程序的情况下创建web服务(您可以向Internet或业务伙伴公开web服务)。这与RPC有很大的不同,RPC的客户端和服务大部分时间是一起构建的。基于基本的安全实践,默认情况下服务异常不会发送到客户端。你不想把内部信息暴露给你的未知客户。

    对于您的问题:

    服务引用不是最新的:是的,这对于版本控制非常重要。我可以构建新版本的web服务并使用旧的客户机代码。如果您同时构建客户机和服务,并且您确信客户机和服务的新版本总是在同一时间部署,那么您可以使用Andrew的建议。

    无法序列化类型:Web服务正在使用可互操作的格式进行数据交换。您认为编译器应该如何知道类型是否可序列化?它是否应该在每个构建期间运行所有数据类型的序列化?正如John所建议的,通过适当的测试策略可以很容易地发现这一点。

    服务尝试传递比客户端允许的更多的数据:这是什么意思?您的意思是服务可以传递由于服务的新版本而不为客户所知的其他字段吗?在这种情况下,您会抱怨最重要的版本控制特性之一。或者你的意思是服务可以发送比客户端允许的更大的消息?在这种情况下,服务应该如何知道未知客户机上允许的大小?MaxReceiveMessage大小是对拒绝服务攻击的防御,由接收方控制。如果您需要在通信中处理动态消息大小,则必须对其进行编码。

    隐藏错误:默认情况下,每个服务在其行为中都有以下配置:

    <serviceDebug includeExceptionDetailInFault="false" />
    

    只需将其更改为true add WCF Tracing + socket tracing WCF Message logging 你会得到 MS在.NET中为开发人员提供的最好的诊断工具

        2
  •  3
  •   John Saunders    14 年前

    你完全错了。WCF不会对您隐藏错误。你一定是找错地方了。

    您查看过Windows事件日志(应用程序)吗?你打开WCF跟踪了吗?

    您需要控制更新服务引用的时间。仅仅因为你已经更改了合同并不意味着现在是时候对合同的每一个引用进行更新了。更新服务引用可能需要更改客户机代码,而且很可能需要再次对其进行测试。

    您希望如何在不序列化的情况下了解序列化错误?如果你想确定你的序列化工作,那么创建一个单元测试序列化!

    总的来说,WCF工作得很好。像任何技术一样,你在学习的时候更容易感到沮丧。

        3
  •  1
  •   Andrew Shepherd    14 年前

    回答你的一个问题:

    当您自己没有编写或维护服务合同时,“添加服务引用”功能非常有用。如果服务、客户机和服务契约在同一个解决方案中,最好不要依赖自动生成的服务引用。它们不会自动更新只是其中一个原因。

    看到了吗 this presentation

    推荐文章