以前在 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)
等)。
关于c# - IIS session 在发布 Web 上丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25747991/