Проблема с кнопкой «Назад» после выхода из системы в asp.net [duplicate]

Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.

Предположим, у вас есть веб-форма Contact.aspx, чей класс codebehind Свяжитесь с вами, и у вас есть имя объекта Contact.

Затем следующий код вызовет исключение NullReferenceException при вызове context.SaveChanges ()

Contact contact = new Contact { Name = "Abhinav"};
var context = new DataContext();
context.Contacts.Add(contact);
context.SaveChanges(); // NullReferenceException at this line

Ради полноты класса DataContext

public class DataContext : DbContext 
{
    public DbSet Contacts {get; set;}
}

и класс сущности контакта. Иногда классы сущностей являются частичными классами, так что вы можете распространять их и в других файлах.

public partial class Contact 
{
    public string Name {get; set;}
}

Ошибка возникает, когда оба класса entity и codebehind находятся в одном и том же пространстве имен. Чтобы исправить это, переименуйте класс сущности или класс codebehind для Contact.aspx.

Причина. Я все еще не уверен в причине. Но всякий раз, когда какой-либо из классов сущностей расширяет System.Web.UI.Page, возникает эта ошибка.

Для обсуждения рассмотрим NullReferenceException в DbContext.saveChanges ()

27
задан Jens Roland 21 April 2010 в 23:26
поделиться

7 ответов

Беспокойство об истории браузера и обратной кнопке даст вам головные боли и генитальные бородавки. Для решения этой проблемы есть средства.

Ваша кнопка выхода / кнопка должна указывать на страницу, содержащую этот код, и все, что вы хотите.

[vb.net]

Imports System.Web.Security

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
 Handles MyBase.Load
    Session.Abandon()
    FormsAuthentication.SignOut()
End Sub

[c #]

using System.Web.Security;

private void Page_Load(object sender, System.EventArgs e)
{
    // Put user code to initialize the page here
    Session.Abandon();
    FormsAuthentication.SignOut();
}

Код исходит из этой страницы и действителен, но страница сильно на глаза.

Хороший вопрос / ответ о поведении с подлодками можно найти здесь здесь .

Обновление:

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

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();

Мне любопытно узнать, работает ли оно для вас, как и для меня.

22
ответ дан Community 25 August 2018 в 07:41
поделиться
  • 1
    Это не ответ на этот вопрос. – nima 29 November 2011 в 15:05
  • 2
    Будет ли это также отключить кэширование css / js? Благодарю вас: D – Randel Ramirez 27 January 2013 в 15:30
  • 3
    @Sky Sanders - Подождите, вы не сказали кому-то в ответ ниже, что Response.Cache.SetCacheability (HttpCacheability.NoCache) был ли он «потерял рассудок?». Несмотря на это, мне все равно нравится ваш ответ – deebs 14 June 2016 в 20:24

Этот код очень полезен

Response.Cache.SetCacheability(HttpCacheability.NoCache);

. Поместите этот код только в событие загрузки, на главном pagen в случае, но он работает только для IE, для IE и Firefox я использовал

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
1
ответ дан Andrew Barber 25 August 2018 в 07:41
поделиться

на самом деле я нашел решение, я добавил следующий фрагмент к методу загрузки страницы главной страницы.

Page.Response.Cache.SetCacheability(HttpCacheability.NoCache);

спасибо за ответ в любом случае:)

-3
ответ дан Eatdoku 25 August 2018 в 07:41
поделиться
  • 1
    Эй, повернись, я думаю, ты где-то потерял свой разум ...; -p Это похоже на попытку исправить часы кувалдой. Если честно, это соответствует DWTF. Пожалуйста, передумайте. – Sky Sanders 21 April 2010 в 23:32
  • 2
    ладно !! ... позволь мне попробовать еще раз :) – Eatdoku 22 April 2010 в 00:38

Вы можете использовать javascript для отключения кнопки «Назад» (обычно путем отправки пользователя на страницу, которая пересылается на другую страницу, так что щелчок назад снова отправляет вам вперед). Постоянный пользователь все еще может вернуться на 2 этапа назад и перешагнуть через цикл.

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

3
ответ дан MatthewMartin 25 August 2018 в 07:41
поделиться
  • 1
    Мэтью, зачем предлагать взломать, когда есть функция, встроенная для решения проблемы? – Sky Sanders 21 April 2010 в 23:33
  • 2
    Session.Abandon и FormsAuthentication.SignOut не указывает браузеру очистить кеш (а браузер и прокси между ними не должны соблюдать заголовок без кэша). Кэшированные страницы все равно могут быть загружены, и если запрос делается из страницы в кеше клиента после того, как сеанс является фиксированным, не сообщая, каков будет результат, возможно, NullReferenceExceptions, когда страница начинает проверять переменные сеанса (и перенаправление на страницу входа в систему). – MatthewMartin 22 April 2010 в 00:03
  • 3
    Затем кеш-память должна быть установлена ​​дискретно на чувствительные или изменчивые страницы, которые не должны быть воскрешены. Вы не можете управлять клиентом и пытаться просто добавить сложность. Если они захотят вернуться после 3-х кликов на странице, срок ее действия истек.?!?! больше власти для них. Во всяком случае, я не догадываюсь, что вы просто говорите ... p.s. используйте @sky, чтобы убедиться, что я получаю ответы на комментарии. – Sky Sanders 22 April 2010 в 01:10
  • 4
    @Sky Я буду тестировать это завтра, если у меня будет время, но когда мое приложение прошло проверку безопасности (большая компания), код уже сделал вывеску, которую вы предложили (и каждый должен, не поймите меня неправильно на этом ). Таким образом, он был безопасным, но вы все равно могли перемещаться назад и просматривать страницы в кеше. Кроме того, если вы попытались сделать сообщение с одной из этих страниц в кеше, вы получите сообщение на странице пароля (чтобы оно было безопасным), но при перенаправлении обратно на страницу оригинала не было указано, будет ли сеанс там. Чтобы сделать его довольно сложным для возврата и повторной передачи с устаревшей страницей, мы отключили кнопку «Назад». – MatthewMartin 22 April 2010 в 02:56
  • 5
    Круто. Я добавил код, который я использую, чтобы предотвратить кеширование. Я использую это в основном для обработчиков json, но должен быть применимым и эффективным. – Sky Sanders 22 April 2010 в 03:09

Вы можете попробовать использовать свойство HttpResponse.Cache, если это поможет:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;

if (Response.Cache.VaryByParams["Category"])
{
//…
}

Или может блокировать кэширование страницы в целом с помощью HttpResponse.CacheControl, но ее устарело в пользу кэша свойство выше:

Response.CacheControl = “No-Cache”;

ИЛИ вы действительно можете сходить с ума и сделать все это вручную:

Response.ClearHeaders();
Response.AppendHeader(“Cache-Control”, “no-cache”); //HTTP 1.1
Response.AppendHeader(“Cache-Control”, “private”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “no-store”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “must-revalidate”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “max-stale=0″); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “post-check=0″); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “pre-check=0″); // HTTP 1.1
Response.AppendHeader(“Pragma”, “no-cache”); // HTTP 1.1
Response.AppendHeader(“Keep-Alive”, “timeout=3, max=993″); // HTTP 1.1
Response.AppendHeader(“Expires”, “Mon, 26 Jul 1997 05:00:00 GMT”); // HTTP 1.1

Ссылка

0
ответ дан Matthieu 25 August 2018 в 07:41
поделиться

Лучшая работа - разместить следующий код на главной странице. Он избегает кеширования страниц и не позволяет пользователю получить доступ к нему после выхода из системы.

P.S: Следующие коды являются компиляцией из разных источников. Отправил его, чтобы любой, кто искал решение, мог бы найти его полезным

Master.cs

protected void Page_Load(object sender, EventArgs e)
    {
        Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetNoStore(); 

    }

Master.aspx

<a href="logout.aspx">Logout</span></a>

logout.cs

protected void Timer1_Tick(object sender, EventArgs e)
        {
            Session.Clear();
            Session.Abandon();


 Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetNoStore();

        try
        {
            Session.Abandon();
            FormsAuthentication.SignOut();
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Buffer = true;
            Response.ExpiresAbsolute = DateTime.Now.AddDays(-1d);
            Response.Expires = -1000;
            Response.CacheControl = "no-cache";
            //Response.Redirect("login.aspx", true);
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
        Response.Redirect("Signin.aspx");
    }

logout.aspx

<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" Text="Loggin Out Please Wait" runat="server" />
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="Timer1_Tick">
            </asp:Timer>
        </ContentTemplate>
    </asp:UpdatePanel>
</div>

</div>
</form>
0
ответ дан S.Mohamed 25 August 2018 в 07:41
поделиться

Ваш ответ

Обходной путь к этому - добавить следующий код javascript в раздел страницы logout.aspx:

<script type="text/javascript">
 window.history.forward(1);
</script>

Этот javascript-код отправит пользователя обратно, если пользователь доберется до страницы выхода из системы, нажав кнопку «Назад».

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

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 
1
ответ дан Tejas 25 August 2018 в 07:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: