Migration of ASP.NET app from IIS6 to IIS7 (7.5)
For many of us familiar problem. You developing applications under IIS6 and you're about to move them to IIS7. In previous version of IIS was enough to copy over your files, create app pool and site. IIS7 (7.5) is different in this point.
In IIS6 there was only one way hot to extend server with other features – using ISAPI filters. Whole .NET is lived within one dll aspnet_isapi.dll. If the request was for files with .NET type extensions (such .aspx, .ashx, .axd and so on) your application know them and was able to serve them. If request was for file with extension for example .jpg or other static file, the application was not aware about them. For example this is the reason why URL authorization does not work for static files.
IIS7 offers two modes of work:
- Classic – In IIS requests are processed by above description. Basically the system is compatible with previous versions of IIS
- Integrated – the default one. In this mode has IIS privileged position, the HTTP handlers and modules (known from ASP.NET) can be executed directly. They are in line with ISAPI filters and built-in IIS functionality.
HTTP handlers, modules were not changed at all, so you don't need to rewrite or recompile them. But was has been changed is the way how to know IIS about which handler, module to use. Basically this is often problem when app is running properly under IIS6 but won't under IIS7. This is not such difference between IISs but it's big difference between Classic and Integrated mode on application pool. You have two options:
- Put your application under Classic managed pool (this is not recommended, use it only in case when other solutions fails)
- Change the registration of modules and handlers in web.config file to reflect newest configuration schema.
There is no difference whether you register handler or module under IIS6 or IIS7 Classic Mode. Illustration of its registration in web.config:
<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*My.axd" type="MyHttpHandler"/>
</httpHandlers>
<httpModules>
<add name="MyModule" type="MyHttpModule"/>
</httpModules>
</system.web>
</configuration>
In case of web.config in II7 Integration mode, registration will looks like:
<?xml version="1.0"?>
<configuration>
<system.webServer>
<handlers>
<add name="NameOfMyHandler" verb="*" path="*My.axd" type="MyHttpHandler"/>
</handlers>
<modules>
<add name="MyModule" type="MyHttpModule" preCondition="managedHandler"/>
</modules>
</system.webServer>
</configuration>
Generally you have to perform these changes:
- you need rename httpHandlers to handlers and httpModules to modules.
- Handlers has required attribute name, so you have to name them
- Modules should have attribute preCondition with value managedHandler. This is optional and depends on behavior of particular module (module will called only in case when its execution will be driven by handler written in .NET).
Changes can be done manually or by command line tool (see bellow).
HTTP modules are called for each request. In case of II6 or Classic mode it means for each request mapped in aspnet_isapi.dll configuration. For integrated mode it means for all request including for static files.
Well sometimes you run into problem when you your app needs to work IIS6 as well IIS7. Problem is once you register handlers and module in system.webServer section you need to remove their registration from system.web section. If the IIS would ignore old registration insystem.web section I could be security risk caused by not executed some modules, handlers. Mostly those for authentication and authorization. But there is am option how to avoid this checking and allow to have registrations in both sections. All you need to do is to turn off validation by attribute validateIntegratedModeConfiguration. Using this attribute is not really recommended.
So the universal web.config for both scenarios would looks like:
<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*My.axd" type="MyHttpHandler"/>
</httpHandlers>
<httpModules>
<add name="MyModule" type="MyHttpModule" />
</httpModules>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<handlers>
<add name="NameOfMyHandler" verb="*" path="*My.axd" type="MyHttpHandler"/>
</handlers>
<modules>
<add name="MyModule" type="MyHttpModule" preCondition="managedHandler"/>
</modules>
</system.webServer>
</configuration>
Instead of modifying web.config manually, you can perform required changes from command line by
%windir%\system32\inetsrv\Appcmd migrate config "<ApplicationPath>"
ApplicationPath is the virtual path of the application containing the site name, such as "Default Web Site/app1" or site name map in IIS, for example Default Web Site.
The tool will modify web.config in order to move registration of handlers, modules fromsystem.web to system.webServer section.
Migate the web.config of Application, run the migration command as below.
C:\> %systemroot%\system32\inetsrv\APPCMD.EXE migrate config "Default Web Site/app1"
Successfully migrated section "system.web/httpModules".
Successfully migrated section "system.web/httpHandlers".
If you are going to migate the web.config of Site, don’t miss a forward slash ("/") after the domain name.
C:\> %systemroot%\system32\inetsrv\APPCMD.EXE migrate config "Default Web Site/"
Successfully migrated section "system.web/httpModules".
Successfully migrated section "system.web/httpHandlers".
Otherwise you may get an error like below,
ERROR ( message:Cannot find APP object with identifier “Default Web Site”. )
Even you've did web.config changes you app can still failing under Integration mode. The most common is "Request is not available in this context" exception. This happens when your implementation is about to access Request object in Application_Start method of global.asaxfile. Error is due to design change in the II7 Integrated pipeline that makes Request object unavailable in Application_Start. The Classic mode has no problems with it. What you can do about it is to change your app to avoid reference to Request context inside Application_Startor running app under Classic mode (not recommended). More about avoiding reference to Request object you can find on Mike Volodarsky's blog.
Migration of ASP.NET app from IIS6 to IIS7 (7.5)的更多相关文章
- ASP.NET程序从IIS6移植到IIS7时出现500.22错误
最可能的原因: • 此应用程序在 system.web/httpModules 节中定义配置. 可尝试的操作: • 将配置迁移到 system.webServer/modules 节 ...
- ASP.NET程序从IIS6移植到IIS7时出现500.22错误(转)
最可能的原因: • 此应用程序在 system.web/httpModules 节中定义配置. 可尝试的操作: • 将配置迁移到 system.webServer/modules 节.也可 ...
- 如何将ASP.NET-WebApi发布到IIS6.0上(转)
关于"如何将ASP.NET-WebApi发布到IIS6.0上"的这方面的学习,一开始项目组长让我们接触的时候,我的心情是这样的 哇呜.jpg 当时真的是一脸懵逼啊,对于刚接触asp ...
- IIS6.0 IIS7.5应用程序池自动停止的解决方法
前边提到由win2003升级到win2008 server r2 64位系统,然后用了几个小时配置IIS7.5+PHP+MYSQL等的环境,先是遇到IIS7.5下PHP访问慢的问题,解决之后又出了新的 ...
- IIS6.0 IIS7.5应用程序池自动停止的解决方法 搜集整理
来源:http://www.guchengnet.com/1499.html IIS6.0 IIS7.5应用程序池自动停止的解决方法 搜集整理 发表于2016年12月14日 有2.3个月没有用本地的i ...
- IIS6与IIS7在编程实现HTTPS绑定时的细微差别
本文章其实最主要信息是: 问题出在那个小小的*号上——IIS6中不支持通配符,第一部分为空时表示(All Unsigned),而IIS7中同时支持空或通配符的写法,如果为空则自动转为*:443:,我们 ...
- IIS6、IIS7.5设置网站默认首页方法(Directory Listing Denied)
这篇文章主要介绍了IIS6.IIS7.5设置网站默认首页方法,如果不设置访问目录就会提示Directory Listing Denied,就是不允许列出文档,为了安全网站都会设置不设置默认,需要的朋友 ...
- Asp.net APP 重置密码的方式
在开发ASP.NET WEB APP的时候,时间长了容易忘记最初设置的密码,即使打开数据库也不好重置,因为密码都是加密存储在数据库中的.下面是几种通过代码重置密码的方式: 第一种: string re ...
- 关于ASP.NET MVC4在IIS6中不认识安卓移动设备的解决办法
在IIS7中发现安卓的手机浏览器是可以跳转滴. 项目中是采用***.mobile.cshtml来显示移动视图的. 部署到IIS6.0中发现并没有转到*.mobile.cshtml移动视图. 进过漫长的 ...
随机推荐
- Hicharts弄个样例
前端的事情,但最好自己要了解一下,能作个最简单的东东出来... 样例,需要的时候,用用,就喟给它一样模板数据即可. PYTHON,把字典的键值和KEY值匹配成列表即可. $(function () { ...
- Winform的多线程问题
http://blog.csdn.net/Maths_bai/article/details/6000744
- Android开发将List转化为JsonArray和JsonObject
客户端需要将List<Object>转化为JsonArray和JsonObject的方法: 首先,List中的Object的属性需要是public: class Person { publ ...
- 【踩坑记】从HybridApp到ReactNative
前言 随着移动互联网的兴起,Webapp开始大行其道.大概在15年下半年的时候我接触到了HybridApp.因为当时还没毕业嘛,所以并不清楚自己未来的方向,所以就投入了HybridApp的怀抱. Hy ...
- 【HDOJ】2721 Persistent Bits
题目有点长,但是题意说的很清楚.位操作. #include <stdio.h> ]; int main() { int a, b, c, s; int i, j, k, n, tmp, m ...
- (转)Ubuntu下彻底卸载mysql
感谢原作者,文章内容很实用.原文链接:http://www.blogjava.net/yjhmily/articles/336926.html ============================ ...
- Page Object 模式编写UiAutomator脚本
在我们学习Page Object Model之前,我们先了解一下Page Object Model(以下简称POM). 为什么要POM 用UiAutomator启动UI自动化测试不是一件困难的任务.你 ...
- [App]Xamarin First(Or Last One) App
这个应用简单得无以复加,主要是熟悉了使用Xamarin Studio进行Android开发的配置和基本流程. 以前未曾具体得做过App开发,现在大致了解了开发所包含的基本元素. 如上图,在Layout ...
- [ZETCODE]wxWidgets教程六:事件处理
本教程原文链接:http://zetcode.com/gui/wxwidgets/events/ 翻译:瓶哥 日期:2013年12月7号星期六 邮箱:414236069@qq.com 主页:http: ...
- maven构建带版本号和日期的war包名
21166312 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !import ...