2016-04-20 8 views
3

Мы только что перенесли наш веб-сайт на новые веб-серверы, начиная от IIS6 до IIS8. Все работает так, как ожидалось, кроме одного. Всякий раз, когда пользователь загружает страницу после истечения срока их аутентификации, они запускают исключение нулевой ссылки.Страница ASP.net хранит загрузку после перенаправления формы-аутентификации

Пользователи сами перенаправляются правильно на страницу входа, как и следовало ожидать, но, по-видимому, исходная загруженная страница продолжает выполняться, и как только она достигает части страницы, которая зависит от пользователя для входа в систему, мы удалите нулевое ссылочное исключение.

На IIS6 у нас никогда не было этой проблемы. На IIS8 мы получаем это несколько сотен раз в день, что очень раздражает.

Это может быть просто вопрос конфигурации, но до сих пор мой прибегая к помощи не получилось что-нибудь

Web.config (слегка отредактированный, чтобы защитить виновных)

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> 
    <configSections> 
    <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
     <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
     <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" /> 
     <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
      <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere" /> 
      <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" /> 
      <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" /> 
      <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" /> 
     </sectionGroup> 
     </sectionGroup> 
    </sectionGroup> 
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler" /> 
    </configSections> 
    <system.web> 
    <pages enableViewStateMac="true"> 
     <controls> 
     <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     </controls> 
    </pages> 
    <httpRuntime maxRequestLength="8192" executionTimeout="800" /> 
    <httpHandlers> 
     <remove path="*.asmx" verb="*" /> 
     <add path="*.asmx" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false" /> 
     <add path="*_AppService.axd" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false" /> 
     <add path="ScriptResource.axd" verb="GET,HEAD" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false" /> 
     <add path="BusyBoxDotNet.axd" verb="*" type="BusyBoxDotNet.ResourceHttpHandler, BusyBoxDotNet" /> 
     <add path="ChartAxd.axd" verb="*" type="Dundas.Charting.WebControl.ChartHttpHandler" validate="false" /> 
    </httpHandlers> 
    <httpModules> 
     <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    </httpModules> 
    <globalization culture="en-US" /> 
    <sessionState mode="StateServer" timeout="480" /> 
    <authentication mode="Forms"> 
     <forms cookieless="UseCookies" domain=".stuff.topleveldomain" enableCrossAppRedirects="true" name=".morestuff" timeout="480" /> 
    </authentication> 
    <machineKey validationKey=".." decryptionKey="..." validation="SHA1" /> 
    <customErrors mode="RemoteOnly" defaultRedirect="~/Public/ErrorPage.aspx"> 
     <error statusCode="404" redirect="~/Public/FileNotFound.htm" /> 
    </customErrors> 
    <membership defaultProvider="CustomAspNetSqlMembershipProvider"> 
     <providers> 
     <remove name="AspNetSqlMembershipProvider" /> 
     <add name="CustomAspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="Common" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="true" applicationName="stuff" requiresUniqueEmail="true" minRequiredPasswordLength="4" minRequiredNonalphanumericCharacters="0" passwordFormat="Clear" maxInvalidPasswordAttempts="10000" passwordAttemptWindow="10" passwordStrengthRegularExpression="" /> 
     </providers> 
    </membership> 
    <roleManager enabled="true" defaultProvider="CustomAspNetSqlRoleProvider"> 
     <providers> 
     <clear /> 
     <add connectionStringName="Common" applicationName="stuff" name="CustomAspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" /> 
     </providers> 
    </roleManager> 
    <compilation debug="true"> 
     <assemblies> 
     <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" /> 
     <add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
     <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
     <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
     <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
     <add assembly="System.Web.Extensions.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
     </assemblies> 
    </compilation> 
    </system.web> 
    <!-- Configuration for pages that do not require authentication --> 
    <location path="public"> 
    <system.web> 
     <authorization> 
     <allow users="*" /> 
     </authorization> 
    </system.web> 
    </location> 
    <location path="Images/Misc"> 
    <system.web> 
     <authorization> 
     <allow users="*" /> 
     </authorization> 
    </system.web> 
    </location> 
    <location path="Images/Pics"> 
    <system.web> 
     <authorization> 
     <allow users="*" /> 
     </authorization> 
    </system.web> 
    </location> 
    <location path="stylesheet"> 
    <system.web> 
     <authorization> 
     <allow users="*" /> 
     </authorization> 
    </system.web> 
    </location> 
    <system.codedom> 
    <compilers> 
     <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4"> 
     <providerOption name="CompilerVersion" value="v3.5" /> 
     <providerOption name="WarnAsError" value="false" /> 
     </compiler> 
     <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4"> 
     <providerOption name="CompilerVersion" value="v3.5" /> 
     <providerOption name="OptionInfer" value="true" /> 
     <providerOption name="WarnAsError" value="false" /> 
     </compiler> 
    </compilers> 
    </system.codedom> 
    <system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules> 
     <remove name="ScriptModule" /> 
     <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    </modules> 
    <handlers> 
     <remove name="WebServiceHandlerFactory-Integrated" /> 
     <remove name="ScriptHandlerFactory" /> 
     <remove name="ScriptHandlerFactoryAppServices" /> 
     <remove name="ScriptResource" /> 
     <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add name="ScriptResource" verb="GET,HEAD" path="ScriptResource.axd" preCondition="integratedMode" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    </handlers> 
    <defaultDocument> 
     <files> 
     <remove value="index.php" /> 
     <remove value="default.aspx" /> 
     <remove value="iisstart.htm" /> 
     <remove value="index.html" /> 
     <remove value="index.htm" /> 
     <remove value="Default.asp" /> 
     <remove value="Default.htm" /> 
     <add value="login.aspx" /> 
     </files> 
    </defaultDocument> 
    </system.webServer> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 
+0

Не могли бы вы разместить здесь свой файл конфигурации? –

+0

Определенно, дайте мне знать, если вам нужно что-нибудь еще, чтобы пойти дальше – Grubsnik

+0

Если у вас есть шанс, вы можете сделать небольшую страницу, насколько это возможно, которая воспроизводит проблему? Для меня страница никогда не запускается, если я не вошел в систему. Модуль 'FormsAuthentication' отправляет меня на страницу входа в систему до того, как это произойдет ... – user1429080

ответ

2

Это заставляет меня думать о параметре endresponse метода HttpResponse.Redirect (Указывает ли выполнение текущей страницы следует прекратить):

Если вы не явно конец текущего запроса во время выполнения перенаправление, поток выполнения будет продолжаться. Это может произойти в вашем случае.

За считанные производительности, наиболее часто используемый метод перенаправления, Redirect(String), вызовите внутренне Redirect(String, Boolean) переопределения, с false в качестве значения для параметра endresponse.

Таким образом, вы могли бы попытаться заменить вызов (ы) для

Response.Redirect("[login URL]"); 

по

Response.Redirect("[login URL]",true); 

и посмотреть, если это решить вашу проблему

Дополнительная информация на сайте MSDN:

https://msdn.microsoft.com/en-us/library/a8wa7sdt(v=vs.110).aspx

+0

Это было правильное решение. По-видимому, IIS6 и IIS8 обрабатывают это по-другому, или была другая разница между серверами, которые мы пропустили. – Grubsnik

0

Попробуйте настроить пул приложений в режиме класса против интегрированного

APP POOL

+0

Он уже работает в классическом режиме. – Grubsnik

0

стоит указать страницу по умолчанию и страницу входа, если пользователь не прошел проверку подлинности. Это предотвратит выполнение кода на других страницах.

<authentication mode="Forms"> 
     <forms loginUrl="~/Login" timeout="480" defaultUrl="~/" /> 
</authentication>