IIS会话在发布Web上丢失

本文关键字:Web 会话 IIS | 更新日期: 2023-09-27 18:21:09

以前在Visual Studio 2012中使用Web项目时,我可以点击"发布Web"按钮,只要不对任何.config或.cs文件进行任何更改,大多数时候我的会话数据都会保持不变,这样我就不必每次对.css或.html文件进行小更改时都再次登录。

为了使用w3wp.exe进行调试,我篡改了一些设置,现在每次单击"发布Web"时,会话数据都会丢失,即使我在两次发布之间完全没有更改。

我不知道我做了什么来改变这一点,但我真的需要能够对静态文件进行更改,而无需每次都登录。如何防止会话被终止?

IIS会话在发布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'fontscss'images),则会有所帮助。

  • Copy任务还有其他几个属性(例如ContinueOnErrorOverwriteReadOnlyFiles),您可能需要对它们进行修改。

  • 您也可以在目标路径中使用标准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