Skip to main content
 首页 » 编程设计

c#之IIS session 在发布 Web 上丢失

2024年02月06日38jirigala

以前在 Visual Studio 2012 中使用我的 Web 项目时,只要我不对任何 .config 或 .cs 文件进行任何更改,我就可以点击“发布 Web”按钮,大部分时间我的 session 数据都会保留这样我就不必每次对 .css 或 .html 文件进行小的更改时都重新登录。

为了使用 w3wp.exe 进行调试而进行了一些设置之后,现在每次单击“发布 Web”时 session 数据都会丢失,即使我在发布之间完全没有进行任何更改也是如此。

我不知道我做了什么来改变它,但我真的需要能够对静态文件进行更改,而不必每次都登录。如何阻止 session 被终止?

请您参考如下方法:

这取决于您发布的内容。即使您没有在知情的情况下进行任何更改,应用程序域也会在以下情况下卸载:

  • web.config 被再次复制(内容无关紧要)
  • bin 文件夹已修改(同样,具有较新时间戳的相同 dll 被视为修改)

据我所知,Publish 总是更新 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> 
    

    这会阻止部署这 2 个文件夹,这样您的应用程序域就不会卸载, session 也不会丢失。您仍然可以在需要时使用其他配置文件进行完整发布。

  • 在“发布”>“设置”>“文件发布选项”中,确保未选中“删除所有现有文件...”选项。

希望这些解决方法中的一种或全部能够解决您的问题。

更新:根据评论,这是一个简单的 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 task 有几个您可能想要修改的其他属性(例如 ContinueOnError、OverwriteReadOnlyFiles)。

  • 您还可以在目标路径中使用标准 VS 宏(例如 $(SolutionRoot)、$(OutputDir) 等)。