C# 关于WCF,我遗漏了什么?

C# 关于WCF,我遗漏了什么?,c#,wcf,web-services,C#,Wcf,Web Services,在这个阶段,我在MS技术领域的开发时间比我想的要长。当.NET出现时,我认为他们一针见血,随着每次迭代和版本的发布,我认为他们的技术越来越强大,并期待着每次发布 然而,去年我不得不与WCF合作,我必须说我发现这项技术很难使用和理解。起初,它非常吸引人,但当你开始深入到它的本质时,配置是一场噩梦,必须覆盖消息大小、消息中包含的对象数量、安全模型的复杂性、,在出现故障时处理代理,最后返回到用代码而不是XML定义接口 它只是无法开箱即用,我认为应该这样做。我们发现上述所有问题时,要么测试自己,要么当我

在这个阶段,我在MS技术领域的开发时间比我想的要长。当.NET出现时,我认为他们一针见血,随着每次迭代和版本的发布,我认为他们的技术越来越强大,并期待着每次发布

然而,去年我不得不与WCF合作,我必须说我发现这项技术很难使用和理解。起初,它非常吸引人,但当你开始深入到它的本质时,配置是一场噩梦,必须覆盖消息大小、消息中包含的对象数量、安全模型的复杂性、,在出现故障时处理代理,最后返回到用代码而不是XML定义接口

它只是无法开箱即用,我认为应该这样做。我们发现上述所有问题时,要么测试自己,要么当我们的产品在现场

我确实理解这一切背后的理由,但他们肯定可以想出更简单的实施机制

我想我要问的是

  • 我是否以错误的方式看待WCF
  • 过去几年,它有什么优势 替代品
  • 在什么情况下我应该 选择使用WCF
好了,伙计们,很抱歉延迟回复,工作确实有一个讨厌的习惯,有时会碍事:)

一些澄清 我想我的WCF的主要绘画点可以分为以下几个方面 虽然它是开箱即用的,但你的左手在引擎盖下有一些重大的惊喜。正如上面所指出的,基本事物在被覆盖之前是受限制的

  • 无法传递的字符串大小不能超过8K
  • 单个消息中可以传递的对象数受到限制
  • 代理无法从故障中自动恢复
  • 虽然配置的数量是一件好事,但了解所有配置、使用什么以及在什么情况下使用,可能很难理解。尤其是在现场部署具有不同安全要求的软件时。在谈到配置时,我们不得不将大量软件隐藏在后端数据库中,因为现场的安全和网络人员试图在不理解的情况下更改配置文件中的内容
  • 将接口的配置保留在代码中,而不是转移到XML中显式定义的接口,XML几乎可以被任何东西发布和使用。我知道我们可以从程序集中导出XML,但它充满了垃圾,某些代码生成器被它卡住了 我知道世界在前进,在过去的22年里,我已经前进了很多次,并且积极地使用WCF,所以别误会,我知道它的用途和发展方向


    我只是认为应该有更简单的配置/部署选项,更容易的设置和更好的配置管理(可能是SQL配置提供程序,而不仅仅是web.config/app.config文件)。

    在澄清之后,我将解决您的其他问题。同时,我可以回答您关于何时应该选择使用WCF:always的问题

    WCF是旧的ASMX技术(包括WSE)的替代品。它也是.NET远程处理的替代品。在可预见的未来,.NET中的高级通信功能将基于这项技术

    例如,考虑Windows Azure。“云计算”的新概念将其通信方面纳入WCF并非不可避免。然而,WCF具有足够的灵活性,可以扩展到涵盖这些情况,而代码的变化很小


    如果您在使用WCF时遇到问题,那么最好确保Microsoft了解它。WCF是web服务和.NET中其他面向服务的开发的现在和未来,因此他们有非常强烈的动机倾听您的意见并解决您的痛点。或者直接通过联系他们,或者在这里问问题(请用WCF标记),很多人都会帮助你。

    我现在一直在使用WCF,我也分享你的痛苦。这看起来似乎是严重的过度设计,但我们将被困在它很长很长一段时间,所以我试图学习它


    有一点我是肯定的,XML很糟糕。我在使用XML来控制它时遇到了很多问题,从那以后,我开始转向通过代码来处理所有事情。

    看看您是如何提到XML和SQL的,您正在使用WCF来构建一个web应用程序或一个实际的web服务(web上的服务,而不仅仅是SOAP交换)

    它有助于将WCF看作.NETRemoting(或DCOM、CORBA等)的替代品,而.NETRemoting也恰好支持作为传输之一的web服务。程序集中声明的接口、代理的行为、某些配置选项以及从web应用程序的角度来看看起来不自然和复杂的框架的其他方面,对于分布式对象的DCOM样式系统来说,实际上是现成的


    回答这个问题:不,您没有遗漏任何东西,而且对web应用程序使用WCF是复杂的,因为WCF不是构建web应用程序的框架。可能这样的框架可以建立在它之上,但我不希望看到WCF本身被改变为进入web领域。

    为了解决应用程序配置的维护问题,一些标准(如UDDI或WS-Discovery)已经存在,WS-Discovery将由.NET 4.0中的WCF支持

    保持 在代码中使用接口,而不是移动 在中显式定义接口的步骤 XML,可以发布和 几乎被任何东西所消耗。我知道我们 可以从assembley导出XML, 但它充满了垃圾和确定 代码生成器被它卡住了

    你能说得更清楚些吗?我认为您所说的是在代码中配置的服务行为
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall, ConcurrencyMode=ConcurrencyMode.Single)]
    
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Multiple)]