IIS会话在发布Web上丢失
本文关键字:Web 会话 IIS | 更新日期: 2023-09-27 18:21:09
以前在Visual Studio 2012中使用Web项目时,我可以点击"发布Web"按钮,只要不对任何.config或.cs文件进行任何更改,大多数时候我的会话数据都会保持不变,这样我就不必每次对.css或.html文件进行小更改时都再次登录。
为了使用w3wp.exe进行调试,我篡改了一些设置,现在每次单击"发布Web"时,会话数据都会丢失,即使我在两次发布之间完全没有更改。
我不知道我做了什么来改变这一点,但我真的需要能够对静态文件进行更改,而无需每次都登录。如何防止会话被终止?
这取决于您发布的内容。即使你没有故意做出任何更改,应用程序域也会卸载,如果:
web.config
被再次复制(内容无关紧要)bin
文件夹被修改(同样,具有较新时间戳的相同dll被视为修改)
AFAIK,发布总是更新web.config
。有一件事我不确定,如果您没有任何转换(.debug.config或.release.config),它是否会更新web.config
。
你可以尝试以下几种方法:
-
将
web.config
的生成操作设置为"无"。这样可以防止它被复制到输出端。 -
定义一个新的构建配置,比如"静态内容"。使用此构建配置,定义一个新的发布配置文件,如"静态内容"。将这些行添加到
.csproj
文件<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> ... <OutputPath>bin'</OutputPath> <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn> <ExcludeFilesFromDeployment>web.config</ExcludeFilesFromDeployment> <ExcludeFoldersFromDeployment>bin</ExcludeFoldersFromDeployment> </PropertyGroup>
这将阻止部署这两个文件夹,这样你的应用程序域就不会卸载,会话也不会丢失。您仍然可以在需要时使用其他配置文件进行完整发布。
-
在"发布">"设置">"文件发布选项"中,确保取消选中"删除所有现有文件…"选项。
希望这些解决方案中的一个或全部能够解决您的问题。
更新:根据注释,这里有一个简单的AfterBuild
目标,它只递归地将更改后的文件复制到发布文件夹。只需将以下代码复制到.csproj
文件中,并适当调整路径即可。
<!-- define static content to be copied over -->
<ItemGroup>
<SourceFiles Include="CSS'**'*.css" />
<SourceFiles Include="Scripts'**'*.js" />
</ItemGroup>
<!-- The target that gets executed after build finishes and copies files recursively -->
<Target Name="AfterBuild">
<Copy
SourceFiles="@(SourceFiles)"
DestinationFolder="C:'Publish'YourApp'%(RecursiveDir)"
SkipUnchangedFiles="True"
/>
</Target>
现在,当您构建时,您应该看到静态内容被发布到您的发布文件夹中。
注意:
%(RecursiveDir)
递归地复制文件,这有助于重建文件夹树。如果您有嵌套的文件夹(如css'fonts
和css'images
),则会有所帮助。Copy
任务还有其他几个属性(例如ContinueOnError
、OverwriteReadOnlyFiles
),您可能需要对它们进行修改。您也可以在目标路径中使用标准VS宏(例如
$(SolutionRoot)
、$(OutputDir)
等)
你指的是asp.net会话吗?如果是,则每次重新启动应用程序池时都会还原它。可能由以下原因引起:
- web配置更改
- bin文件夹内容更改
- IIS应用程序池回收
一般来说,依赖会话数据是错误的做法。您必须始终检查数据是否存在,如果不退出,则在不强制用户登录的情况下进行恢复。
但是,如果在SateServer或SqlServer模式下运行会话,则可以使会话保持活动状态:会话状态模式
解决方案1:
在IIS中设置一个新站点以保存所有静态文件。例如
-确保它使用的应用程序池与其他站点不同
NewSite/Css/.CssNewSite/Scripts/.jsNewSite/JQueryNewSite/BootStrap
(不要真的创建这个结构,你可以用一个新的vs项目来管理它)
etc
仅为其提供localhost主机标头(MachineName和Port)内部访问权限。
现在,使用现有项目在解决方案中创建一个新项目,将所述文件移动到与上述结构匹配的位置。
设置一个新的发布配置文件,将您的css、脚本等部署到您创建的新站点http://{machinename}:port
将配置文件称为类似Dev_PublishStatics或Prod_Publishtatics(如果需要)
现在,您可以在Project 2中对CSS/脚本进行更改,并通过重置Site A 来发布它们
-最后在您的主站点中,创建虚拟目录,指向您在上面创建的站点中的Css、Scripts等的目录。
--备注如果你愿意,你也可以将ASPX文件等移动到新网站,并通过虚拟目录映射它们,但dll需要在两个网站的Bin文件夹中。但它是有效的,只要记住,如果你更改了代码,你需要发布到这两个网站。
解决方案2:
更改应用程序池设置,
IIS Manager
-> Application Pools
->-> Select Site Application Pool
->->-> Advanced Settings on the actions menu
现在将"禁用配置更改的回收"设置为True,这将阻止站点在配置更改时重置。当需要加载新代码时,您需要记住自己重置它。
我还建议设置
Start Mode = Always Running
Disable Overlapped Recycle = true