C# 发布Web上的IIS会话丢失

C# 发布Web上的IIS会话丢失,c#,session,visual-studio-2012,web,iis-7.5,C#,Session,Visual Studio 2012,Web,Iis 7.5,以前,在Visual Studio 2012中的Web项目中,我可以点击“发布Web”按钮,只要我在大多数情况下没有对任何.config或.cs文件进行任何更改,我的会话数据就会保持不变,这样我就不必在每次对.css或.html文件进行小的更改时再次登录 在搞乱了一些设置以使w3wp.exe调试正常运行后,现在每次单击“发布Web”时,会话数据都会丢失,即使在发布之间完全没有做任何更改 我不知道我做了什么来改变这一点,但我真的需要能够在没有每次登录的情况下对静态文件进行更改。如何阻止会话被终止?

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

在搞乱了一些设置以使w3wp.exe调试正常运行后,现在每次单击“发布Web”时,会话数据都会丢失,即使在发布之间完全没有做任何更改


我不知道我做了什么来改变这一点,但我真的需要能够在没有每次登录的情况下对静态文件进行更改。如何阻止会话被终止?

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

  • web.config
    再次被复制(内容无关紧要)
  • bin
    文件夹已修改(同样,具有较新时间戳的相同DLL被视为修改)
好的,发布总是更新
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>
    
    现在,在构建时,应该可以看到静态内容被发布到发布文件夹中

    注意事项:

    • %(RecursiveDir)
      以递归方式复制文件,这有助于重建文件夹树。如果您有嵌套的文件夹,如
      css\font
      css\images
      ,则会很有用

    • 任务还有一些其他属性(如
      ContinueOnError
      overwriteradonlyfiles
      ),您可能需要修改这些属性

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


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

    • web.config
      再次被复制(内容无关紧要)
    • bin
      文件夹已修改(同样,具有较新时间戳的相同DLL被视为修改)
    好的,发布总是更新
    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>
      
      现在,在构建时,应该可以看到静态内容被发布到发布文件夹中

      注意事项:

      • %(RecursiveDir)
        以递归方式复制文件,这有助于重建文件夹树。如果您有嵌套的文件夹,如
        css\font
        css\images
        ,则会很有用

      • 任务还有一些其他属性(如
        ContinueOnError
        overwriteradonlyfiles
        ),您可能需要修改这些属性

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


        • 你是说asp.net会话吗?如果是,则每次重新启动应用程序池时都会恢复。这可能是由于:

          • web配置更改
          • bin文件夹内容更改
          • IIS应用程序池回收
          通常,依赖会话数据是错误的做法。您必须始终检查数据是否存在,并在不强制用户登录的情况下退出恢复

          但是,如果在SateServer或SqlServer模式下运行会话,则可以使会话保持活动状态:
          你是说asp.net会话吗?如果是,则每次重新启动应用程序池时都会恢复。这可能是由于:

          • web配置更改
          • bin文件夹内容更改
          • IIS应用程序池回收
          通常,依赖会话数据是错误的做法。您必须始终检查数据是否存在,并在不强制用户登录的情况下退出恢复

          但是,如果在SateServer或SqlServer模式下运行会话,则可以使会话保持活动状态: 解决方案1:

          在IIS中设置新站点以保存所有静态文件。例如

          -确保它使用与其他站点不同的应用程序池

          NewSite/Css/.Css NewSite/Scripts/.js NewSite/JQuery 新闻站点/引导

          (不要实际创建此结构,您可以使用新的vs项目来管理它)

          仅为其提供本地主机头(MachineName和端口)内部访问权限

          现在使用现有项目在解决方案中创建一个新项目,将所述文件移动到与上述结构匹配的解决方案中

          设置一个新的发布配置文件,将css、脚本等部署到您创建的新站点http://{machinename}:port

          将概要文件称为Dev_PublishStatics或Prod_PublishStatics(您需要的w/e)

          现在,您可以在项目2中对CSS/脚本进行更改,并通过重置站点A发布它们

          -最后 在主站点中,创建虚拟目录,指向您在上面创建的站点中的Css、脚本等目录

          --注释 您还可以将ASPX文件等移动到新站点和地图
          IIS Manager
          -> Application Pools
          ->-> Select Site Application Pool
          ->->-> Advanced Settings on the actions menu
          
          Start Mode = Always Running
          Disable Overlapped Recycle = true