WCF:WTF! WCF是提高标准还是提高复杂性级别?

时间:2020-03-05 18:49:28  来源:igfitidea点击:

我了解WCF提供的由三部分组成的服务/主机/客户端模型的价值。但是仅仅是我还是WCF似乎采取了一些直接而直接的方法(ASMX模型)并将其弄得一团糟?

除了使用SvcUtil的命令行后退一步来生成代理之外,还有其他方法吗?通过ASMX服务,自动提供了测试工具。今天使用WCF有什么好的选择吗?

我感谢WS *与WCF紧密集成,并希望在那里找到WCF的回报,但是请稍等一下,否则我会感到困惑。

另外,可用于WCF的书籍充其量只能说是糟糕透顶。 Juval Lowy是一位出色的作家,他写了一本很好的O'Reilly参考书" Programming WCF Services",但对于现在学习使用WCF而言(无论如何对我来说)做得并不多。那本书的前身(是一个更好的组织形式,但作为一个教程却不多)是Michele Leroux Bustamante的Learning WCF。它有很多优点,但是过时了,相应的网站也消失了。

除了继续使Google脱颖而出之外,我们是否还有很好的WCF学习参考资料?

谢谢,
rp

解决方案

回答

MSDN?我通常对Library引用本身做得很好,而且通常希望在那里找到有价值的文章。

回答

我看不到它经常被提及,但是我们仍然可以使用WCF来实现相当简单的服务,这与ASMX服务非常相似。例如:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class SimpleService
{
    [OperationContract]
    public string HelloWorld()
    {
        return "Hello World";
    }

}

我们仍然必须在web.config中注册端点,但这还不错。

消除分离的数据,服务和操作合同的冗长性对于使WCF对我来说更易于管理大有帮助。

回答

就其提供的功能而言,我认为答案是兼容性。 ASMX服务非常Microsofty。并不是说他们没有尝试与其他消费者兼容。但是除了ASP.NET网页和其他一些自定义的Microsoft使用者之外,该模型的适用性并不高。而WCF由于其体系结构而使服务具有基于开放标准的端点,例如除了常用的SOAP外,还包括REST,JSON等。与ASMX相比,其他人使用WCF服务的时间可能要容易得多。

(这基本上是从MSDN比较阅读中推断出来的,因此,了解更多的人应该随时纠正我。)

回答

等等....我们曾经使用过.NET Remoting吗,导致多数民众赞成在取代它。 .NET Remoting本身非常复杂。我发现WCF更容易且布局更好。

回答

WCF比ASMX强大得多,并且它在几种方面进行了扩展。 ASMX仅限于HTTP,而WCF可以使用多种协议进行通信(当然,HTTP仍然是大多数人使用它的方式,至少对于需要互操作的服务而言)。 WCF也更容易扩展。至少可以通过无法扩展ASMX的方式对其进行扩展。 "简单"可能正在扩展它。 =)

在我看来,WCF提供的添加功能远远超过了它所添加的复杂性。我也觉得编程模型更容易。例如,DataContracts比必须使用具有公共属性的XML序列化进行序列化要好得多。它在本质上也更具声明性,这也很好。

回答

如果使用VS2008并创建WCF项目,则在单击运行/调试时会自动获得测试工具,并且可以添加引用,而不必使用svcutil。

回答

VS2008包括"添加服务引用"上下文菜单项,该菜单项将在后台为我们创建代理。

如前所述,WCF不仅旨在替代ASMX Web服务类型,而且还为所有可互操作的服务提供一致,安全和可扩展的方法,无论是通过HTTP,TCP,命名管道还是MSMQ传输。

我将承认我确实还有WCF的其他问题(例如,在通过basicHTTP公开服务时重写方法签名,请参见此处,但总的来说,我认为这是肯定的改进)

回答

我很难确定何时应该使用WCF。为什么?因为我将生产力和简单性放在了首位。为什么ASMX模型如此成功,因为它可以工作,而且我们可以快速工作。借助VS 2005和.NET 2.0,wsdl.exe吐出了非常不错且合规的服务。

在现实生活中,体系结构中应该只有很少的通信协议。这使它易于维护。如果我们需要使用旧系统,请为它们编写特定的适配器,以便它们可以在漂亮而又漂亮的SOA世界中使用。

回答

WCF不应被视为ASMX的替代品。从它的位置以及如何在Microsoft内部使用它来看,它实际上是用于任何类型的跨边界通信的基本体系结构。

回答

我相信WCF确实可以从许多方面推动ASMX Web服务的实现。首先,它提供了一个非常好的分层对象模型,可以帮助隐藏分布式应用程序的内在复杂性。
其次,我们可以拥有多个请求-重放消息传递模式,包括从服务器到客户端的异步通知(纯HTTP不可能),其次,从XML消息传递中抽象出底层传输协议,从而优雅地支持HTTP,HTTPS,TCP等。与"第一代" Web服务的向后兼容性也是一个加号。
WCF使用XML标准作为内部表示格式。这可能被视为有利或者不利,尤其是随着诸如JSON之类的" XML的无脂肪替代品"的日益普及。

回答

我通常使用Google查找WCF答案,并且通常会在以下博客中找到自己:

包含有价值的WCF文章的博客

  • http://blogs.msdn.com/drnick/default.aspx
  • http://blogs.msdn.com/wenlong/default.aspx
  • http://blogs.thinktecture.com/buddhike/
  • http://www.dasblonde.net/default.aspx

我发现的其他有价值的文章

  • http://blogs.conchango.com/pauloreichert/archive/2007/02/22/WCF-Reliable-Sessions-Puzzle.aspx
  • http://blogs.msdn.com/salvapatuel/archive/2007/04/25/why-using-is-bad-for-your-wcf-service-host.aspx

回答

我最初对WCF的想法是完全一样的!以下是一些解决方案:

  • 使用泛型对自己的代理/客户端层进行编程(请参阅类ClientBase,Binding)。我发现这很容易上手,但是很难完善。
  • 使用第三方实现1(我目前最喜欢SoftwareIsHardwork)

回答

我发现使用WCF的困难之处在于管理客户端和服务器的配置,以及对不太好的故障状态异常进行故障排除。

如果有人有任何快捷方式或者提示,那就太好了。

回答

好的,我们开始。首先,Michele Leroux Bustamante的书已针对VS2008进行了更新。该书的网站没有消失。现在,它已经上线了,并且有大量的WCF信息。在该网站上,她为书中的所有示例提供了与VS2008兼容的更新代码。如果我们从亚马逊订购,则将获得更新的重印本。

WCF不仅是ASMX的替代品。当然,它可以(并且做得很好)代替ASMX,但是真正的好处是它可以使服务成为自托管的。 WSE的大多数功能从一开始就已融入其中。该框架是高度可配置的,并且通过多种协议为多个端点提供服务的能力非常出色,IMO。

尽管我们仍然可以通过"添加服务参考"选项生成代理类,但这不是必需的。我们真正要做的就是复制ServiceContract接口,并告诉代码在哪里可以找到服务的端点,仅此而已。我们可以使用很少的代码从服务中调用方法。使用此方法,我们可以完全控制实现。无论选择哪种方法生成代理类,Michele都会在这方面的出色网络广播系列中同时显示和使用这两种方法。

Michele那里有很多优质的材料,我建议我们查看她的网站。在学习WCF时,以下一些链接对我非常有用。我希望我们能认识到WCF到底有多强大,以及实现起来多么容易。学习曲线有些陡峭,但是我们花在时间上的回报是值得的:

  • 米歇尔(Michele)的网络广播:http://www.dasblonde.net/2007/06/24/WCFWebcastSeries.aspx
  • Michele的书籍网站(针对VS2008进行了更新):http://www.thatindigogirl.com/

我建议我们至少观看Michele的网络广播之一。她是一位非常有效的演示者,在WCF方面,她显然学识渊博。她从根本上揭开了WCF内部工作神秘面纱。

回答

我发现这很痛苦;因为我在两端都有.NET,在两端都加载了相同的"合约" dll等。但是随后,我不得不搞砸了很多细节,例如" KnownType"属性。

在更改大量配置之前,WCF还默认只允许1个或者2个客户端连接到服务。从代码更改配置并不容易,运送大量的comfig文件不是一种选择,因为将我们的更改合并到升级时客户可能已进行的任何更改中都太困难了(同样,我们也不希望客户使用WCF设置!)

.NET远程处理通常在大多数时间都有效。

我认为试图假装.NET到.NET基于对象的通信与将Text(xml)发送到未知系统相同,这是一个太远了。

(有几次我们使用WCF与Java系统进行通信,我们发现Java系统发出的XSD无论如何都与它想要的XML不匹配,因此必须手动编码许多XML映射。)