ASP.NET网站发布到IIS后验证码不能显示与IIS模式

在VS2012上调试运行都正常,把网站部署到IIS后,登陆界面的验证码不能显示了(验证码是通过另一个页面嵌入到登陆页面上的),在网上看到了好多解决方案,启用父路径,验证码的路径问题,登陆权限问题等等,都没有解决。不经意看到了一篇IIS应用程序池添加ASP.NET v4.0的博客,对比在其他电脑发布网站的配置,终于找到了可行的解决方案。


有些在IIS6开发的代码需要运行于经典模式,因为在集成模式下会出现错误信息。可能在安装.NET Framewrok 4.0之前,IIS就已经装好了,结果在IIS的应用程序池中只有ASP.NET 2.0的Classic .NET AppPool和ASP.NET v4.0integrated。在使用vs2012开发的程序时,由于使用的是.NET Framework 4.0,所以部署到IIS上的时候,页面提示“无法识别的属性targetFramework"错误,而使用v4.0 集成模式又会提示错误信息。

解决方案1:重新安装.NET Framewrok 4.0

在Frameworv4.0的目录中安装的程序以管理员权限重新运行一下就可以了.执行以下命令:

%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i


应用程序池中就会有v4.0的应用程序池,然后再在Win7下打开控制面板--管理工具--Internet 信息服务(IIS)管理器,选择网站,在右边的“基本设置”中,将“应用程序池”修改为“ASP.NET v4.0 Classic”,如下图所示:

ASP.NET网站发布到IIS后验证码不能显示与IIS模式_第1张图片


解决方案2:配置网站为IIS集成模式

配置IIS后可能运行提示以下错误:

HTTP 错误 500.23 - Internal Server Error
检测到在集成的托管管道模式下不适用的 ASP.NET 设置。

其中由于在IIS7的应用程序池有两种模式, “集成模式”和“经典模式”。在IIS6上运行的代码在集成模式下会出现这种错误。
那么可以直接将网站配置成集成模式下运行,也可以解决验证码不能显示的问题。
如果使用集成模式,那么对自定义的httpModules 和 httpHandlers 就要修改配置文件,需要将他们转移到<modules>和<hanlders>节里去。
修改web.config配置文件:例如原先设置(你的环境中可能没有httpModules,httpHandlers节点)

<system.web>
............
<httpModules>

<add name="WebbHttpModule" type="Webb.WAVE.Controls.Upload.WebbHttpModule,Webb.WAVE.Controls.Upload" />

<add name="rewriteUrl" type="RewritUrl.Rw,RewritUrl" />
</httpModules>
<httpHandlers>
<add path="*.myh" verb="GET" type="MyHandler" />
</httpHandlers>

</system.web>

在IIS7应用程序池为“集成模式”时,改为:

<system.web>
...........
</system.web>
<system.webServer>
<modules>
<add name="WebbHttpModule" type="Webb.WAVE.Controls.Upload.WebbHttpModule, Webb.WAVE.Controls.Upload" />
<add name="rewriteUrl" type="RewritUrl.Rw,RewritUrl" />
</modules>
<handlers>
<add name="MyHandler" path="*.myh" verb="GET" type="MyHandler" preCondition="integratedMode" />
</handlers>
</system.webServer>

如果你的web.config没有httpModules,httpHandlers节点,则直接在节点system.webServer中添加:

<validation validateIntegratedModeConfiguration="false" />

这样可以禁止验证集成模式,避免错误提示。


经典模式(classic mode)和集成模式(Integrated mode)

经典模式下,IIS会用ISAPI扩展(ISAPI extension aspnet_isapi.dll)和 ISAPI过滤器(ISAPI filter aspnet_filter.dll)来调用ASP.NET运行库来处理请求。服务器会用两种管道来处理请求一个负责源代码,另外一个负责托管代码。在这种模式下,应用程序不能充分使用IIS7.X提供的服务。

集成模式是一种统一的请求处理管道,集成模式下不管托管代码还是本机代码,都可以在身份验证和执行处理程序被插入到内核代码的托管代码拦截,它将ASP.NET请求管道与IIS核心管道组合在一起,ASP.NET从IIS插件(IIS extension)的角色进入了IIS的核心去监测每个请求和操作。

IIS7集成模式还增加了MapRequestHandler、LogRequest 和 PostLogRequest 事件,如果在经典模式下加了这些处理事件,会抛出:此操作要求使用 IIS 集成管线模式。如果集成模式下不让IIS处理不兼容集成模式的配置以及处理方式,可以在web.config中配置:

<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>

你可能感兴趣的:(.net,framework,asp.net,验证码,IIS)