返回
基础
分类

必赢手机登录网址上节课我们介绍了  自我寄宿  的知识点 以及注意事项,IIS 帮助文件上对 IIS 5.0 隔离模式的解释

日期: 2020-02-08 14:09 浏览次数 : 128

将 Windows 2000 升级到 Windows 2003 后,安装 SharePoint,但提示 IIS 以 5.0 隔离模式运行,无法继续。

核心功能和服务
已对 IIS 6.0 进行了重新设计以便利用基本 Windows 内核 HTTP.sys。这使其具有内置的响应和请求缓存和队列功能,并能够将应用程序进程请求直接路由到工作进程,从而改善可靠性和性能。

代码

必赢手机登录网址 1

IIS 6.0 引入了两种用于配置应用程序环境的操作模式:工作进程隔离模式和 IIS 5.0 隔离模式。在安装 IIS 6.0 时默认的隔离模式取决于您执行的是全新安装还是升级。

  密码:3913

打开网站属性,找到服务标签,把隔离模式的勾去了就可以了。

在全新安装 IIS 6.0 之后,IIS 以工作进程隔离模式运行。 
在从较低版本的 IIS 6.0 升级之后,隔离模式与以前安装的 IIS 6.0 版本所配置的相同。 
在从 IIS 5.0 或 IIS 4.0 升级之后,在默认情况下,IIS 6.0 以 IIS 5.0 隔离模式运行,这样可保持与现有应用程序的兼容性。 
有关从一种隔离模式切换到另一种隔离模式的信息,请参阅配置隔离模式。

不是特殊的Demo,我们不再贴实例Demo的图片了,直接去网盘找相应的项目看

必赢手机登录网址 2

  IIS 5.0 IIS 5.1 IIS 6.0 
平台 Windows 2000 Windows XP Professional Windows Server 2003 家族 
体系结构 32 位 32 位和 64 位 32 位和 64 位 
应用程序进程模型 TCP/IP 内核 
DLLhost.exe(处于中等或高应用程序隔离模式下的多个 DLL 主机)
TCP/IP 内核 
DLLhost.exe(处于中等或高应用程序隔离模式下的多个 DLL 主机)
HTTP.sys 内核 
当 IIS 以 IIS 5.0 隔离模式运行时:Inetinfo.exe(对于进程内应用程序)或 DLLhost.exe(对于进程外应用程序)


IIS 帮助文件上对 IIS 5.0 隔离模式的解释:

当 IIS 以工作进程隔离模式运行时:W3wp.exe(多工作进程)

 

在 IIS 6.0 中,默认的进程模式是工作进程隔离。由于后向兼容性,IIS 5.0 隔离模式同样可用。

配置数据库配置 二进制 二进制 XML 
安全性 Windows 身份验证 
SSL

上节课我们介绍了  自我寄宿  的知识点 以及注意事项,那这节课我们就说说    通过操作系统现有的进程激活方式为WCF服务提供宿主  的 寄宿方式

以 IIS 5.0 隔离模式运行 WWW 服务

Kerberos

 

选择该选项可以对违反工作进程隔离模式限制的应用程序使用 IIS 5.0 隔离模式,例如下列情况:

Windows 身份验证 
SSL

WCF的服务寄宿,究其本质,就是创建或激活一个进程,为WCF服务构建一个运行环境。IIS本身可以看做一个自动化的进程激活工具。

  • 多实例 ISAPI:为由多个进程加载所编写的并且并发运行的 ISAPI 应用程序。
  • 工作外进程:所编写的将请求转给其他工作进程的应用程序。工作进程隔离模式不支持该进程。
  • 持续在进程内的会话状态:在进程内持续会话状态的应用程序。在工作进程回收前可能丢失会话状态。总是持续进程外的状态不是 ASP.NET 应用程序的问题。

Kerberos

以ASP.NET应用为例:我们通过HTTP协议请求寄宿于目的WEB服务器(IIS)的某个ASP.NET资源,比如aspx页面或asmx服务等。IIS会将该请求转发给相应的工作进程,如果该进程不存在,则激活或创建一个新的工作进程来处理该请求。同理,也可以采用相似的进程激活机制来处理基于WCF的服务寄宿。

安全向导

 

Windows 身份验证 
SSL

 

Kerberos

借助于IIS寄宿WCF服务是最常见的服务寄宿方式,能够适应真正的企业级服务部署的要求。基于IIS的WCF服务寄宿使用于各种典型的Windows平台和不同的IIS版本

安全向导

下面列出了比较典型的操作系统和IIS版本的组合:

Passport 支持

WindowsXP(SP2)+IIS5.1

远程管理 
HTMLA 无 HTMLA 
终端服务
远程管理工具 (HTML) 
终端服务

Windows2003+IIS6.0

群集支持 
IIS 群集 Windows 支持 Windows 支持 
WWW 服务 
Windows 9x 上的个人 Web 管理器 
Windows 2000 上的 IIS
(可选)Windows XP Professional 上的 IIS Windows  

Windows 7+IIS7.0

IIS 5.0 隔离模式
IIS 5.0 隔离模式按照与 IIS 5.0 中的进程管理相似的方式管理应用程序进程:所有的进程内应用程序都在 Inetinfo.exe 内运行,进程外应用程序在单独的 DLL 宿主中运行。一些现有应用程序可能无法并发运行或将会话状态与应用程序分开存储。因此,在 IIS 5.0 隔离模式中运行进程可以确保与大多数现有应用程序的兼容性。下图显示如何在 IIS 5.0 隔离模式中处理应用程序进程。

Windows Server 2008+IIS7.0

配置数据库配置
IIS 6.0 的配置数据库以 XML 文件形式存储,而不是以早期版本中的二进制格式存储。位置仍在原处,但是操作方式(更新、回滚、还原和扩展)已发生了变化。有两个重要文件,并非一个:MetaBase.xml 和 MBSchema.xml。

Windows 8+IIS8.0

有关 IIS 配置数据库的详细信息,请参阅关于配置数据库。

Windows 10+IIS8.5

管理
在 IIS 4.0 中,应用程序既可以在与 Internet 服务相同的进程中运行,也可以在单独的进程中运行。在 IIS 5.0 和 5.1 中,应用程序现在可以分为若干汇集的进程以增强性能并提高可伸缩性。 详细信息,请参阅关于应用程序。在 IIS 6.0 工作进程隔离模式中,可将应用程序组合到任意数量的应用程序池中。 
“应用程序映射”属性页包含一个超文本传输协议 (HTTP) 动作列表,它们可由映射到特定文件类型的应用程序进行处理。该动作列表与 IIS 4.0 有一处不同。在 IIS 4.0 中,列表中包含“已排除”或未被处理的动作。这个改变是为了适应新的 HTTP 动作,以便将其添加到协议中。 有关应用程序映射的详细信息,请参阅设置应用程序映射。 
必赢手机登录网址 ,群集不是 IIS 6.0 的功能(不支持 IISsynche.exe)。群集是 Windows Server 2003 家族的功能。有关 Windows 群集 (MSCS) 的信息,请参阅 Windows Server 2003 家族的帮助。 
与 IIS 4.0 相比,IIS 5.0 中自定义错误文件的位置已经改变。 详细信息,请参阅启用详细的自定义错误消息。 
已经添加了新的自定义错误文件,以便报告更详细的错误信息以及与新功能有关的错误。 有关可用的自定义错误消息的完整列表,请参阅关于自定义错误消息。 
基于 Web 的 Internet 服务管理器 (HTML) 已经由 Web 工具应用。要使用 Internet 服务管理器 (HTML) 远程管理 IIS, 请参阅如何远程管理服务器。 
以编程方式管理
在早期版本的 IIS 中,可以从编译的 C++ 应用程序使用管理基本对象 (ABO) 或者从 C++ 或脚本文件使用 Active Directory 服务界面 (ADSI) 以编程方式管理 IIS。IIS 6.0 包括了 Windows 管理规范 (WMI) 提供程序,WMI 这一技术允许管理员以编程方式控制所有服务和应用程序。详细信息,请参阅使用 IIS WMI 提供程序。有关新的 ADSI 方法的信息,请参阅 IIS 6.0 中的配置数据库更改。

 

Active Server Pages
从 IIS 6.0 开始,Microsoft Active Server Pages (ASP) 可以与 Microsoft ASP.NET 一起使用。有关配置 IIS 以运行 ASP.NET 应用程序的信息,请参阅 ASP.NET。有关 IIS 6.0 中 ASP 功能更改的信息,请参阅 ASP 中的重要更改。

 

ASP 挂起检测
当 IIS 网站繁忙时,可能会出现这种情况:已经产生了最大数量的 ASP 线程,而一些 ASP 线程却挂起,这会导致性能降低。IIS 6.0 能够通过回收作为 ASP ISAPI 扩展 (ASP.dll) 的特定实例宿主的工作进程来解决线程挂起问题。当 ASP 线程在 IIS 6.0 中挂起时,ASP.dll 调用 ISAPI 服务器支持函数 HSE_REQ_REPORT_UNHEALTHY,WWW 服务回收作为 ASP.dll 宿主的工作进程,并在事件日志中创建一个项目。

ASP.NET 本身并不依赖于IIS,它提供一个独立的处理WEB 请求的管道,我们完全可以将ASP. NET运行时寄宿于一个Window Form应用。但是绝大部分基于ASP.NET 应用部署于IIS下,IIS和ASP.NET协同工作处理WEB请求。我们以一个ASP.NET 应用为例,客户端通过浏览器对某一个.aspx页面发起请求,当该请求抵达目的服务器,IIS是第一道屏障。WEB请求经过IIS 管道的处理,被转发 给ASP.NET管道进行进一步的处理。

有关 ISAPI 服务器支持函数的详细信息,请参阅 MSDN® Online 上 ISAPI 扩展参考中的 ServerSupportFunction。

 

安全性
IIS 6.0 中的一个最重要的变动涉及 Web 服务器安全性。为了更好地预防恶意用户和攻击者的攻击,在默认情况下,没有将 IIS 安装在 Microsoft Windows Server 2003 家族的成员上。 

IIS其实就是一个中转站,当ASP.NET 的请求来了,就将这个请求交给处理ASP.NET管道,然后进行下一步处理。

要点 为了更好地预防恶意用户和攻击者的攻击,没有将 IIS 默认安装到 Microsoft® Windows® Server 2003 家族的成员上。而且,当您最初安装 IIS 时,该服务在高度安全和“锁定”的模式下安装。在默认情况下,IIS 只为静态内容提供服务 - 即,ASP、ASP.NET、服务器端包含、WebDAV 发布和 FrontPage® Server Extensions 等功能只有在启用时才工作。如果安装 IIS 之后未启用该功能,则 IIS 返回一个 404 错误。您可以为动态内容提供服务,并通过 IIS 管理器中的 Web 服务扩展节点启用这些功能。同样,如果应用程序扩展未在 IIS 中进行映射,则 IIS 返回一个 404 错误。要映射扩展,请参阅设置应用程序映射。有关如何排解 404 错误(包括 404.2 和 404.3)、与 IIS 6.0 的新安装相关的问题或从低版本的 IIS 进行升级的详细信息,请参阅疑难解答。

 

通过 Web 服务器证书向导和 CTL 向导,您可以同步 Web 和 NTFS 的安全设置、获得并安装服务器证书以及创建和修改证书信任列表。还可以选择一个加密服务提供程序 (CSP) 以使用证书加密数据。 详细信息,请参阅使用证书向导。

IIS5.X 与ASP.NET:

IIS 6.0 中的其他安全性变动包括下列内容:

 

在升级版本上禁用:除非满足下列条件之一,否则在 Windows Server 2003 家族的升级版本上禁用万维网发布服务(WWW 服务): 
在开始升级过程之前,您已在 Windows 2000 Server 上运行了 IIS 锁定向导。IIS 锁定向导通过禁用不必要的功能来减少攻击面,并且它允许您确定为站点启用哪些功能。IIS Lockdown Tool 中提供了 IIS 锁定向导。 
要点 如果使用 WWW 服务,则强烈建议您在升级到 Windows Server 2003 家族中的产品之前,在 Windows 2000 Server 上运行 IIS 锁定向导。IIS 锁定向导通过禁用或删除 Windows 2000 Server 安装中不需要的功能来保护计算机的安全。否则,升级后计算机上仍保留这些功能,这会使您的服务器易受攻击。

我们先来看看IIS5.x是如何处理基于ASP.NET资源请求的。IIS5.x运行在InetInfo.exe中,该进程中一个最重要的服务就是名为World Wide Web Publishing Service(简称W3SVC)的Windows Service。W3SVC的主要功能包括HTTP请求的监听、工作进程的管理及配置管理等。

注册表项 RetainW3SVCStatus 已添加到注册表中 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesW3SVC 的下面。在 RetainW3SVCStatus 下,您可以添加任何值,然后给它赋予一个 DWORD 值。例如,您可以创建注册表项 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesW3SVCRetainW3SVCStatusdo_not_disable,并且 DWORD 值为 1。 
对于无人参与的安装,“DisableWebServiceOnUpgrade = false”项存在于无人参与的安装脚本中。 
通过组策略禁用 IIS:通过使用 Windows Server 2003 家族成员,域管理员可以禁止用户在其计算机上安装 IIS。 
以具有低级访问权限的帐户运行:IIS 工作进程在访问权限极少的用户上下文中运行。这大大减少了潜在攻击的影响。 
提高 ASP 的安全性:所有的 ASP 内置功能总是以具有极少访问权限的帐户 IUSR_computername 运行。 
运行可执行文件的限制:为了运行系统文件夹中的大多数可执行文件(如 cmd.exe),您必须是 Administrators 组、LocalSystem、Interactive 或 Service 帐户的成员。该限制限制了对 Administrators 的远程访问,因此匿名用户无法运行可执行文件。 
修补程序管理:对于修补程序管理,管理员可在不中断服务的情况下安装最新的安全修补程序。 
已知的扩展:IIS 只为对具有已知文件扩展名的文件的请求提供服务。如果请求内容的文件扩展名未映射到已知的扩展,则服务器拒绝请求。 
内容的写保护:在默认情况下,拒绝匿名用户(以 IUSR_computername 帐户运行)对 Web 内容进行写入访问。 
超时和限制:在 IIS 6.0 中,默认设置是安全而主动的,这样可最大限度地减少因以前太宽松的超时和限制而造成的攻击。 
上载数据限制:管理员可以限制能上载到服务器的数据。 
缓冲区溢出保护:工作进程会检测缓冲区溢出,并在检测到时退出程序。 
文件验证:IIS 在将请求发送到请求处理程序(ISAPI 扩展)之前会验证请求的内容是否存在。 
索引资源:该权限现在会在默认情况下启用。 
脚本资源访问:该权限允许访问 ASP 页脚本和其他脚本的“源代码”,它是新增功能,且在默认情况下被禁用。它可在选择了“读取”或“写入”权限时可用。 
子验证:在新安装的 IIS 6.0 中,在默认情况下不再启用。有关详细信息,请参阅 匿名身份验证中的“使用子验证”部分。 
UNC 身份验证:在此版本的 IIS 中,UNC 身份验证方法检查是否有用户凭据。详细信息,请参阅 UNC 身份验证。 
新策略:“禁止安装 IIS”策略已经添加到 Windows Server 2003 产品家族中。该策略允许域管理员控制可以在域中哪些计算机上安装 IIS。详细信息, 请参阅 Windows 帮助中的组策略。 
Fortezza:已取消了对该功能的支持。 
性能
为了限制分配给 ASP 页的内存量,IIS 已经将 AspScriptFileCacheSize 的默认值设置为 250 个 ASP 页,并将 AspScriptEngineCacheMax 的默认值设置为 125 个脚本引擎。在具有一组大量经常请求的 ASP 页的站点上,可以将 ASPScriptFileCacheSize 设置得更高一些。因为 ASP 页的编译比从缓存中检索页要慢很多,所以这会改善性能。在只具有少量经常请求的 ASP 页的站点上,可通过将该数字设置得小一些来节省内存。

我们先看一下 这个 进程 ( 这里我的操作系统因为是 Win10  所以 我就 按照Win10 的界面截图了,与XP  大差不差 )

IIS 工具组件
Windows NT Server 的协作数据对象 (CDONTS):CDONTS 已从 Windows Server 2003 家族中删除。如果 Web 应用程序使用 CDONTS,则可以将它们转换为 Microsoft 协作数据对象 (CDO)。CDONTS 中的大多数方法在 CDO 中都有相匹配的方法,但是名称可能不同。有关平台软件开发工具包 (PSDK) 中 CDO 的参考资料,请参阅 MSDN Online 上的 Overview of CDO。 
未安装 IIS 工具组件:Ad Rotator、Browser Capabilities、Content Linker、Content Rotator、Counters、Logging Utility、My Info、Page Counter、Status 和工具不随 IIS 6.0 一起安装。但是,如果您的 Web 服务器是从低版本的 IIS 升级的,则这些工具组件不会被删除。您可以从 IIS 6.0 资源工具包中获取工具组件 DLL 文件的副本。 
64 位 Windows Server 2003 家族上的 IIS
在 64 位 Windows Server 2003 家族的操作系统上,IIS 作为 64 位应用程序运行。这意味着不能从 64 位 Windows Server 2003 家族的操作系统上的 IIS 调用 32 位应用程序。例如,Jet 数据库引擎将不能转换为 64 位应用程序,因此,不能使用 ActiveX® 数据对象 (ADO) 从 ASP 页打开 Microsoft Access 数据库。但是,仍可以使用 ADO 访问其他驱动程序,如 SQL 和 Exchange。

[ 13-01 ]

 必赢手机登录网址 3

 

当检测到某个HTTP Request时,先根据扩展名判断请求是否是静态资源(比如.html,.img,.txt,.xml),如果是则直接将文件内容以Http Response的形式返回。如果是动态资源(比如.aspx,asp,php),则通过扩展名从IIS 的脚本映射 找到相应的ISAPI 的 DLL 文件来处理

 

ISAPI是Internet服务器API的缩写,是一套本地的Win32API,具有较高的执行性能,是 IIS 和其他动态WEB应用或平台之间的纽带。比如ASP ISAPI 桥接IIS与ASP,而ASP.NET ISAPI 连接着IIS与ASP.NET。ISAPI定义在一个DLL中,ASP.net ISAPI对应的DLL为Aspnet_isapi.dll,也就是说  请求的是一个ASP.NET 请求,那么IIS 就将这个请求转交给 了 Aspnet_isapi.dll 这个文件处理解析。

 

[ 13-02 ]

必赢手机登录网址 4

 

 

ISAPI支持ISAPI扩展(ISAPI Extension)和ISAPI筛选(ISAPI Filter),前者是真正处理HTTP请求的接口,后者则可以在HTTP请求真正被处理之前查看、修改、转发或拒绝请求。

如果我们请求的是一个基于ASP.NET的资源类型,比如:.aspx Web Page,.asmx web service或.svc WCF等,Aspnet_isapi.dll 会被加载, ASP.NET ISAPI扩展会创建ASP.NET的工作进程(如果该进程尚未启动),对于IIS5.X来说,该工作进程为aspnet.exe。IIS 进程与工作进程之间通过命名管道进程通信,以获得最好的性能。也就是说 IIS的进程与aspnet.exe的进程通过管道进行通信。

在工作进程初始化过程中.net运行时被加载,从而构建了一个托管的环境。对于某个WEB应用的初次请求,CLR 会为期创建一个AppDomain。在此AppDomian中,HTTP运行时被加载并用以创建相应的应用。寄宿于IIS5.X的所有WEB应用都运行在同一个进程的不同AppDomain中。

 

 

 

IIS6.0 与ASP.NET:

通过我们的介绍,我们可以看出IIS5.x至少存在着如下两个方面的不足:

1:ISAPI  DLL 被加载到InetInfo.exe进程中,它和工作进程之间是一种典型的跨进程通信方式,尽管采用性能 最好的命名管道,但是仍然会带来性能的瓶颈。

2:所有ASP.NET应用,运行在相同进程中的不同的应用程序域中,基于应用程序域的隔离级别不能从根本上解决一个应用程序对另一个程序的影响,在更多的时候,我们需要不同的WEB应用 运行在不同的进程中。

 

IIS6.0 中,为了解决第一个问题,ISAPI.dll被直接加载到工作进程中。为了解决第二个问题,引入了应用程序池的机制。我们可以为一个或多个WEB应用池的WEB应用提供基于进程的隔离级别。IIS6.0 的工作进程名称为w3wp.exe。

必赢手机登录网址上节课我们介绍了  自我寄宿  的知识点 以及注意事项,IIS 帮助文件上对 IIS 5.0 隔离模式的解释。当然,除了上面两点改进之外,IIS6.0还有其他一些值得称道的地方,其中最重要的一点就是创建了一个新的HTTP监听器:HTTP协议栈(HTTP.SYS).HTTP.SYS运行在Windows的内核模式下,作为驱动程序而存在。它是Windows2003的TCP/IP网络子系统的一部份,从结构上,它属于TCP之上的一个网络驱动程序。严格来说,HTTP.SYS已经不属于IIS范畴了,所以HTTP.SYS的配置信息并不保存在IIS的元数据库中,而是定义在注册表中.

 

HTTP.SYS能够带来如下的好处

持续监听:由于HTTP.SYS是一个网络驱动程序,始终处于运行状态,对于用户的HTTP请求,能够及时作出反应。更好的稳定性:HTTP.SYS运行在操作系统内核模式下,并不执行任何用户代码,所以本身不会受到WEB应用,工作进程和IIS进程的影响。

内核模式下数据缓存:如果某个资源被频繁请求,HTTP.SYS会把响应的内容进行缓存,缓存的内容可以直接影响后续请求。由于这是基于内核模式的缓存,不存在内核模式和用户模式的切换,相应速度得到极大的改进。

 

 

IIS7.0与ASP.NET:

IIS7.0 在请求的监听和分发机制上又进行了革新性的改进,主要体现在对Windows 进程激活服务(WAS)的引入,将原来(IIS6.0)W3SVC承载的部分功能分流给了WAS。具体来说,

通过上面的介绍我们知道对于IIS6.0来说,W3SV主要承载着3大功能。

1:HTTP请求接受:接受HTTP.SYS监听到的HTTP请求。

2:配置管理:从元数据库中加载配置信息对相关组件进行配置。

3:进程管理:创建,回收, 监控工作进程.

 

在IIS7.0 中后两组功能被移入WAS中,接收 HTTP请求的任务仍然落在W3SVC头上。

WAS的引入为IIS7.0 一项前所未有的特性:同时处理HTTP和非HTTP请求。

在WAS中,通过一个重要的接口:监听器适配接口抽象出不同协议监听器监听到的请求。

至于IIS下的监听器,除了基于网络驱动的 HTTP.SYS提供HTTP请求监听功能外,WCF提供了3种类型的监听器:TCP监听器,命名管道,和MSMQ监听器,分别提供了基于TCP,命名管道和MSMQ传输协议的监听功能。

与此3种监听器相对的是3种监听器适配器,它们提供监听器与监听适配器接口之间的适配。 从这个意义上讲,IIS7.0 中的W3SVC更多地为HTTP.SYS起着监听适配器的功能.

 

ASP.NET 集成

从上面对IIS5.X和IIS6.0的介绍中,我们不难发现这一点,IIS与ASP.NET是两个相互独立的管道,在各自管辖范围内,它们各自具有自己的一套机制对HTTP请求进行处理。两个管道通过ISAPI实现"连通",IIS是第一道屏障,当对HTTP请求进行必要的前期处理时,通过ISAPI将请求分发给ASP.NET管道。当ASP.NET在自身管道范围内完成对HTTP请求的处理时,处理后的结果再返回到IIS,IIS对其进行后期处理,最终生成HTTP响应(HTTP Response)。从另一个角度讲,IIS进行在非托管的环境中,而ASP.NET管道则是托管的,从这个意义上讲,ISAPI还是连接非托管环境和托管环境的纽带。

 

 


 

ASP.NET管道:

 

HttpApplication:

HttpApplication是整个ASP.NET基础架构的核心,它负责处理分发给它的HTTP请求。由于一个HttpApplication对象在某个时刻只能处理一个请求,只有完成对某个请求的处理后,HttpApplication才能用于后续的请求的处理。 ( Global.asax 文件继承自HttpApplication 类,我们可以在里面做相应的 全局应用程序 的操作 )所以ASP.NET采用对象池的机制来创建或获取HttpApplication对象。具体来讲,当第一个请求抵达的时候,ASP.NET会一次创建多个HttpApplication对象,并将其置于池中,选择其中

一个对象来处理请求。当处理完毕,HttpApplication不会被回收,而是释放到池中。对于后续的请求,空闲的HttpApplication对象会从池中取出,如果池中所有的HttpApplication对象都处于繁忙的状态,ASP.NET会创建新的HttpApplication对象。对于一个ASP.NET应用来说,HttpApplication派生global.asax文件,我们可以通过创建global.asax文件对HttpApplication的请求处理进行定制。global.asax采用一种很直接的方式实现了这样的功能。

 

HttpModule:

ASP.NET 为创建各种.NET web应用提供了强大的平台,它拥有一个具有高度可扩展性的引擎,并且能够处理对于不同资源类型的请求。那么,是什么成就了ASP.NET的高可扩展性呢?HttpModule功不可没。

从功能上讲,HttpModule之于ASP.NET,就好比ISAPI Filter之于IIS一样。IIS将接收到的请求分发给相应的ISAPI Extension之前,注册的ISAPI Filter会先截获该请求。ISAPI Filter可以获取甚至修改请求的内容,完成一些额外的功能。与之相似地,当请求转入ASP.NET管道时,最终负责处理该请求的是与请求资源类型相匹配的HttpHandler对象。但是在Handler正式工作之前,ASP.NET会先加载并初始化所有配置的HttpModule对象.HttpModule在初始化的过程中,会将一些功能注册到HttpApplication相应的事件

中,那么在HttpApplication整个请求处理生命周期中的某个阶段,相应的事件会被触发,通过HttpModule注册的事件处理程序也得以执行.

 

 

HttpHandler:

如果说HttpModule相当于IIS的ISAPI Filter的话,我们可以说HttpHandler则相当于IIS的ISAPI Extension,HttpHandler在ASP.NET中扮演请求的最终处理者的角色。对于不同资源类型的请求,ASP.NET会加载不同的Handler来处理,也就是说.aspx page与.asmx web service对应的Handler是不同的。

 

所以如果是ASP.NET 的请求  顺序应该是:IIS——ISAPI——ISAPI Filter——ISAPI Extension——Aspnet_isapi.dll——HttpApplication——HttpModule——HttpHandler

 

 

 

到这里我们创建了一个 关于 IIS 寄宿方式的  WCF 的 一个小DEMO( 1.IIS寄宿 )。 在网盘上。

这个项目很简单,所以就不再 过多叙述,因为之前 已经都讲过了。

 

 

 


 

前面我们回顾了 一下关于  IIS 以及 ASP.NET  的 一些知识,接下来就 开始讲解WCF 在 其中的不同。

 

WCF与ASP.NET 并行模式:

对于基于IIS服务寄宿,System.ServiceModel.Activation.HttpModule将基于.svc的请求劫持并分发给WCF的服务模型,从而结束了请求在ASP.NET管道的旅程。除了ASP.NET提供的一些少量底层服务,比如动态编译等,绝大部分ASP.NET对传统的ASP.NET资源的请求处理机制将不会应用在基于WCF Service的请求处理流程中。从这个意义上讲,我们可以说WCF Service的运行模式和ASP.NET运行时采用的是一种并行的模式。

这种并行模式 是一种默认的一种模式。之前的 一个小 DEMO 就是 并行模式。

 

你可以完全把一个映射到IIS虚拟目录的 ASP.NET WebSite 同时作为 .asmx(webService) 和 .svc(WCFService) 的宿主。在这种情况下,.aspx(ASP.NET Page)、 .asmx(WebService) 和 .svc(WCFService) 运行在同一个AppDomain中。但是HttpRuntime 对 .aspx(ASP.NET Page) 和 .asmx(WebService) 的处理机制并不会应用于对 .svc(WCFService) 请求。我们把WCF Service这种寄宿模型称为ASP.NET并行模式.

为什么WCF 要采用这种于ASP.NET并行的模式,而不像Web Service一样采用与ASP.NET完全兼容呢?

 

这主要是因为WCF和 .asmx(WebService) 有本质的区别:

Web Service总是采用IIS寄宿,并使用HTTP作为传输,而WCF则具有不同的寄宿方式,对于传输协议的选择也没有限制。在默认的情况下,不论采用何种寄宿方式,WCF本身的行为应该保持一致。所以,让WCF服务的行为独立于寄宿的环境与传输协议,是采用并行模式的主要原因.

 

 

 

 

但是通过设置,我们可以将 WCF 与 ASP.NET  设置为  兼容模式:

虽然在默认的情况下,IIS的寄宿采用ASP.NET 并行的模式。但是在一个WEB应用中,尤其是一些AJAX的WEB应用,却明确地需要以一种ASP.NET兼容模式处理WCFService请求。比如,在WCFService的操作中,需要获取ASP.NET应用的SessionState等。

WCF 对此提供了支持,实现起来也很简单,对于编程来说,仅仅需要在Service类型(WCF的服务契约实现的Service)加上一个特殊的AspNetCompatibilityRequirementsAttribute特性

并将RequirementsMode属性指定为AspNetCompatibilityRequirementsMode.Allowed

 

除此之外,WCF的配置需要做一些修改,我们需要将<serviceHostingEnvironment/>配置节的aspNetCompatibilityEnabled属性设为true.

 

看代码:

 1     //设置WCF与ASP.NET保持兼容模式
 2     [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
 3     public class Service1 : IService1
 4     {
 5 
 6         public void Add(double x)
 7         {
 8             throw new NotImplementedException();
 9         }
10 
11         public void Subtract(double x)
12         {
13             throw new NotImplementedException();
14         }
15 
16         public void Multiply(double x)
17         {
18             throw new NotImplementedException();
19         }
20 
21         public void Divide(double x)
22         {
23             throw new NotImplementedException();
24         }
25 
26         public double GetResult()
27         {
28             throw new NotImplementedException();
29         }
30 
31     }

并且 配置文件也要改:

1   <system.serviceModel>
2 
3     <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
4 
5   </system.serviceModel>

 

这样子,在ASP.NET 兼容模式下,ASP.NET 将会采用与处理 .aspx , .asmx一样的方式来处理基于.svc 的请求,对于WCFService请求的处理将会贯穿HttpApplication请求处理的整个生命周期。原本实现在HttpModule中对WCFService的请求处理逻辑将实现在一个HttpHandler中。

 

好了,WCF服务 与 ASP.NET 兼容模式 说完了,但是要真正做到贯穿整个请求声明周期还需要客户端的配合,我们接着看。

 

本节课的另一个Demo  ( 2.兼容模式 )  利用ASP.NET兼容模式创建支持会话(Session)的WCF服务。

 

我们的WCF服务是 根据客户端的 Session 中的值来进行计算。

 

我们先看   Client 客户层 项目中的  App.config  配置文件:

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <configuration>
 3   <system.serviceModel>
 4     <client>
 5       <endpoint address="http://localhost/AspServices/Service1.svc" binding="wsHttpBinding" contract="Contract.IService1" name="CalculatorService"  bindingConfiguration="CookieAllowableBinding"></endpoint>
 6     </client>
 7     <bindings>
 8       <wsHttpBinding>
 9         <binding name="CookieAllowableBinding" allowCookies="true"></binding>
10       </wsHttpBinding>
11     </bindings>
12   </system.serviceModel>
13 </configuration>

有一个  allowCookies="true" 的配置。

 

当我们把这个配置去掉也就是把  bindings 节点删掉,并且 将 endpoint 节点的  bindingConfiguration="CookieAllowableBinding" 设置也删掉

 

来运行试一试,很遗憾 所有结果都为0。因为客户端就没有传递Cookie中的Session,对于HTTP的请求,每次请求都为一个新的请求。

 

然后我们再把之前删除的节点加上,再来试一试。

结果很令人满意。这是为什么呢?

那得从Session的实现机制说起。众所周知,HTTP是无状态的传输协议,对于服务端来说,它收到的每个HTTP请求都是全新的请求。ASP.NET会话(Session)的实现很简单,就是让每次HTTP请求携带Session的识别信息(Session ID),那么服务就可以根据此信息判断请求来自哪个客户端了。关于Session识别信息的保存,Asp.Net有两种方式:Cookie和URL,前者将其放到Cookie中,每次HTTP请求将会携带该Cookie的值,后者则将其作为请求URL的一部分。一般情况下采用基于Cookie的实现机制,如果Cookie禁用则采用后者.那么对于ASP.NET兼容模式下的WCF也一样,要想让服务能够识别会话,就需要让每个服务调用的HTTP请求携带Session的识别信息,我们可以通过传递Cookie的方式来解决这个问题。对于WCF来说,Cookie传递能够通过Binding来控制,对于WsHttpBinding来说,默认情况下并不允许Cookie的传递。我们可以通过WsHttpBinding的AllowCookies来控制是否允许传递Cookie,该属性可以通过配置进行设置.

 

 

 

 

 

 

 

 

 

  • 上一篇:没有了
  • 下一篇:没有了