既然,成长是一个必经的过程,那么就让我们小心仔细的成长。在知道怎么做之后,想一想为什么这么做,因为怎么做往往是很简单的,不同的人对为什么这么做有不同的看法,而这就是不同人之间拉开差距的秘密所在。
所以,我写博客的出发点往往是从自己的思考出发,有时候是经过实践验证,有时候是根据推测,其中的两篇:
WCF RIA Service随想
ASP.NET MVC随想
你可以看到大都是我的推测,这些观点很多是找不到出处的。
推测,联想,在学习软件开发或者任何其他学习活动中,我觉得是一种很好的习惯。在软件领域中,有着各式各样的语言,平台,领域,框架,IDE等等,但是在这复杂的表现后面却是有规律的。比如面向对象的思想适合于大多数高级语言,比如软件设计的一些原则适合于各种平台和框架,比如Web的机制适合于所有平台和语言的Web开发。通过对比,联想,推测,你能更深入的去看清技术的本质。
然而,毕竟有时候是推测,这中间难免犯错误。但是我觉得没关系,只要纠正过来就好,知道一个错误总比不知道一个错误的存在好。这不,在《ASP.NET MVC随想》中就被博客园的朋友们指出一个错误,首先在此感谢一些园友:
君之蘭:…另外webform和mvc都是.net的web开发框架,俗称asp.net,wcf是.net的网络开发框架,不是asp.net的,楼主别搞混了。
devil0153:除了最后的总结有点误导(关于wcf)…
Ivony...:WebService显然是建立在ASP.NET的基础上的。而WCF是WebService的超集(包含WebService的技术集),其可以被ASP.NET承载,也可以被别的东西承载。
错误的观点
在《ASP.NET MVC随想》一篇中,我指出:
IIS是Windows操作系统中的一个网络组件,它属于TCP/IP应用层,可以处理网络数据。而ASP.NET是IIS服务器组件的一种接收和处理数据的方式。ASP.NET提供一种开发Web应用程序的基础框架和基础能力。不要Web Form或者MVC依然可以开发ASP.NET Web应用程序。并且还可以有其他的应用程序框架来和IIS交互。
我们所知道的IHttpHandler,HttpContext等属于ASP.NET基础框架,ASP.NET基础框架提供这样的基础能力:
1. 接收来自IIS的原始数据,这个数据是一个Http请求的文本数据
2. 将这个纯文本转化为HttpContext.Request对象,这使得ASP.NET应用程序可以获取请求中的信息,比如Url,Headers,Stream等等
3. 提供一种方式让开发者可以编辑响应文本。不管是转发一个静态文件,还是动态构造一个文档,你可以在继承自IHttpHandler的一个类中自由发挥。可以直接对HttpContext.Response进行赋值
4. 将HttpContext.Response对象转化为响应文本
5. 把这个文本发送给IIS
这就是ASP.NET提供的基础能力,而ASP.NET Web Form和ASP.NET MVC都是在ASP.NET基础框架之上编辑响应文本的一种方式,实际上就是一更好更简单更强大的方式来编辑Html文本,因为我们的Web应用程序一般都是针对浏览器的。
而错误的观点在于我把WCF想成和ASP.NET Web Form和ASP.NET MVC一样,也是基于ASP.NET基础框架。
错误的原因
之所有有这样的结论,有以下几个原因:
1. 我对WCF根本不熟悉。
对WCF的接触还是因为学习Silverlight的时候,因为SIlverlight一般都是通过WCF通信。而那个时候,公司的同事教我怎样添加一个WCF服务,以及怎样在VS中添加客户端。这样就可以了,不需要去了解WCF到底是什么东西,这就是从怎么做着手的。加上WCF繁琐的配置,所以也没有专门去研究。
2. 一切皆是Http的思想
从最开始学习软件开发,就是从ASP.NET开始,几乎没有接触过桌面开发。特别是前几个月开始学习REST,Http协议这些Web的核心东西之后,并有点飘飘然,感觉一些皆是Web,感觉这个世界一切都可以通过Web实现,感觉Web可以做很多很多事情。
然而,殊不知在Web之前,Internet还有很多数据传输和应用程序数据交互的方式,并且脱离Web,应用程序也有许多传输的消息通信,所有并不是所有的应用程序消息通信都通过HTTP的,比如WCF实际上是和传输协议无关的。
3. WCF本身与ASP.NET的特殊关系
一般开发者,比如我,在建立WCF的时候都是在ASP.NET应用程序中,它就像不同与aspx页面的另一个格式的文件,并且都通过HTTP传输,因此很容易产生错误的观点。实际上WCF可以存在于ASP.NET应用程序域中,它还可以存在于任何.NET应用程序域中。
WCF服务和ASP.NET
所以,在博客园的园友们指出错误之后赶快参考资料更正一下。
定义:WCF为服务提供了运行时环境(Runtime Environment),使得开发者能够将CLR类型公开为服务,又能够以CLR类型的方式使用服务。
1. 由此可见,它不依赖于ASP.NET或者IIS,任何.NET的应用程序都可以使用WCF。换句话说,只要能够使用程序集System.ServiceModel.dll的应用程序都可以建立WCF服务。
2. WCF只是提供一个运行时环境,因此它需要托管。每个WCF服务都必须托管在Windows进程中,该进程被称为宿主进程。所以我们可以在IIS中托管,还可以由开发者自己提供和管理进程的生命周期。不同的地方在于IIS可以在客户端提交第一次请求的时候自动启动,还可以借助IIS管理宿主进程的生命周期。但是IIS托管只能使用HTTP协议。
3. WCF不依赖与任何传输协议。所以一个WCF服务的地址应该包含传输协议,机器名称,以及路径。而通常我们在IIS作为宿主进程的情况下只能使用Http协议,所以我们通常看到与Web服务已有的服务地址,但实际上WCF服务还可以采用其他的协议传输。因此在ASP.NET中建立WCF服务只是其中一种方式。
4. WCF支持复杂的消息通信模式,比如选择不同的传输协议,消息编码,通信模式,可靠性,安全性,事务传播以及互操作性等。而为了支持各种不同的配置,WCF采用契约的方式来标示一组配置的组合。WCF服务端和客户端必须采用相同的契约。这就使得不管选择什么样的通信模式,这些与WCF服务本身无关,它们是可配置的。我们可以看一下我画的草图:
总结
我对WCF依然不了解,这里只能是说明和ASP.NET的关系,因为想我一样,我们很容易认为它是基于ASP.NET的。
WCF是非常强大的,通过这次简单的学习,我感受到了它的强大。并且感受到HTTP之外的世界依然十分精彩。
网络通信的分层系统为应用程序之间的通信提供了非常好的扩展,应用程序可以选择不同的传输协议,不同的端口。这样就能和TCP/IP的传输层进行交互。WCF可以说成是一个类似IIS的网络组件,它可以和传输层交互,但是它需要宿主。
初学WCF,有错误还望指正!