【问题标题】:ASP.NET Membership/SQL Server issue - missing dataASP.NET 成员资格/SQL Server 问题 - 缺少数据
【发布时间】:2009-09-13 19:39:34
【问题描述】:

我遇到了一个我似乎无法弄清楚的问题。希望有人能指出我正确的方向,或者给我其他的想法来研究。我现在不会提供太多代码,因为老实说,我认为这不是编码问题。

首先,我有一个 ASP.NET 3.5 Web 应用程序。我正在使用 ASP.NET 成员库进行身份验证。数据位于 SQL Server 2005 数据库中。

我的应用程序使用户能够填写保存在数据库中的请求。填写请求的页面位于包含以下 web.config 文件的子文件夹中(我希望用户在填写请求之前进行身份验证):

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <authorization>
      <deny users="?" />
    </authorization>
  </system.web>
</configuration>

用户需要登录或创建新帐户才能填写请求。当他们提交请求时,他们会收到一封电子邮件确认它已提交。此电子邮件验证的收件人地址是通过以下方式收集的:

Membership.GetUser().Email

到目前为止,这一切似乎都相当初级,并且运行顺利。但是,我刚接到我们的用户的几个电话,他们填写了请求并收到了电子邮件,但在系统中找不到该请求。我让他们将确认电子邮件转发给我,以便我可以查看收件人地址并在 ASP.NET 成员资格表中找到用户。但是,我无法根据电子邮件找到用户,并且当我获得有关他们输入内容的详细信息时,我无法在数据库中找到请求的踪迹。

我没有为用户提供删除帐户或删除请求的方法。无法更改电子邮件地址或编辑相关数据。数据库已完全锁定,所有查询都通过存储过程运行。

现在,我的问题是,这到底是怎么回事?用户需要通过身份验证才能填写请求,并且我有确认电子邮件,其中包含我在系统中找不到的电子邮件地址。邮箱地址是使用上面提到的方法收集的,这对我来说证明了这个用户必须存在于数据库中,指定的邮箱地址。

我真的不知道从哪里开始。有人对检查什么有想法吗?如果我很困惑,我将不胜感激任何建议,如果需要,我可以提供任何其他信息。

提前致谢!

【问题讨论】:

  • 我们能看到保存记录然后发送电子邮件的函数的代码吗?
  • 这是一个简单、直接的存储过程调用,但流经多层系统。我不太确定这是否相关,因为即使电子邮件是使用 Membership.GetUser().Email 调用发送的,我现在也无法追踪 ASP.NET Membership 数据。我知道这封电子邮件已发送,尽管该表单已按照上文详细说明进行了保护。
  • 我假设您还检查了数据库是否设置了电子邮件发送时的 LastActivity?我同意这很奇怪,因为 GetUser 不仅连接回数据库以读取用户信息,而且还会根据调用时间对其进行更新...
  • 问题是用户的记录不再存在于 ASP.NET 成员表中。

标签: asp.net sql-server asp.net-membership


【解决方案1】:

哇,问题解决了。暂存地址由客户提供给最终用户,数据在暂存数据库中。看起来我所有关于数据库完整性的阴谋论都是错误的。 :-)

感谢所有建议!

【讨论】:

    【解决方案2】:

    如果我不得不在没有看到作为注册过程一部分的代码的情况下进行猜测,我会说在将记录保存到数据库时存在一些错误,但在发送电子邮件时却没有。如果这两个操作都包含在可能解决您的问题的事务中,那么除非将记录保存到数据库,否则人们不会收到电子邮件,反之亦然。您是否启用了任何日志记录以显示保存到数据库的任何错误?

    【讨论】:

    • 注册新用户是一个与填写请求不同的过程。使用 Membership.CreateUser(EmailAddressTextBox.Text.Trim(), PasswordTextBox.Text, EmailAddressTextBox.Text.Trim()); 添加新用户。我试图指出如果发送电子邮件,用户必须存在,因为它从会员表中提取电子邮件地址。
    • 是的,我在 global.asax 文件中记录了所有错误,但没有被捕获。
    【解决方案3】:

    我首先发布了要求代码的评论,因为没有代码这将很难回答,但我想到了两种可能性。任何一个都允许发送电子邮件,但数据不会写入数据库:

    1. (不太可能,因为您很容易发现并且您现在已经抓住了它)发送电子邮件的代码在保存到数据库之前执行。

    2. (更有可能)错误处理存在缺陷,即使数据库保存出错,也允许发送电子邮件,例如:

      试试

      {
         SaveToDo();
      }
      catch(Exception ex)
      {
      
        // something here
      
      }
      SendEmail();
      

    【讨论】:

    • 感谢您的回复。我试图指出,如果发送电子邮件,用户必须存在,因为它正在从成员资格表中提取电子邮件地址。此外,电子邮件是在数据库保存后发送的,如果抛出异常,它将被捕获并记录在 global.asax 文件中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多