2009-09-13 2 views
1

У меня проблема, которую я не могу понять. Надеюсь, кто-то может указать мне в правильном направлении или дать мне другие идеи для изучения. Теперь я не буду предлагать много кода, потому что, честно говоря, я не думаю, что это проблема с кодировкой.Проблема с членством в ASP.NET/SQL Server - отсутствующие данные

Во-первых, у меня есть веб-приложение ASP.NET 3.5. Я использую библиотеки членства 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. Тем не менее, я не мог найти пользователя на основе электронной почты, и я не мог найти никаких следов запроса в базе данных, когда мне были даны подробные сведения о том, что они ввели.

Я не предлагаю пользователям удалять свои учетные записи или удалять запрос. Нет способа изменить адрес электронной почты или изменить соответствующие данные. База данных довольно закрыта, и все запросы выполняются через хранимые процедуры.

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

У меня действительно нет ни малейшего понятия, откуда исходить. Есть ли у кого-нибудь идеи о том, что проверить? Я был бы признателен за любые советы, поскольку я в тупик, и я могу предоставить любую дополнительную информацию, если это необходимо.

Заранее благодарен!

+0

Можем ли мы увидеть код функции, которая сохраняет запись, а затем отправить электронное письмо? – David

+0

Это простой, прочный вызов хранимой процедуры, но проходит через многоуровневую систему. Я не уверен, что это уместно, потому что я не могу отследить данные о членстве в ASP.NET, даже если письмо было отправлено с помощью функции Membership.GetUser(). Я знаю, что письмо было отправлено, хотя форма защищена, как описано выше. –

+0

Предполагается, что вы также проверили базу данных для параметра LastActivity, установленного во время отправки сообщения электронной почты? Я согласен, что это странно, потому что GetUser не только соединяется с базой данных, чтобы читать информацию о пользователях, но также обновляет ее со временем ее появления ... –

ответ

1

Whew, проблема решена. Контейнерный адрес был предоставлен клиенту конечным пользователем, а данные были в промежуточной базе данных. Похоже, что все мои теории заговора о целостности базы данных были ложными. :-)

Спасибо за все предложения!

0

Если бы я должен был угадать, не видя кода, который является частью процесса регистрации, я бы сказал, что есть некоторая ошибка в сохранении записи в базе данных, но не при отправке электронной почты. Если оба действия были завернуты в транзакцию, которая может решить вашу проблему, таким образом, люди не получат электронное сообщение, если запись не будет сохранена в БД и наоборот. У вас есть какие-либо протоколирования, которые отображали бы ошибки в БД?

+0

Регистрация нового пользователя - это отдельный процесс, чем заполнение запроса. Новый пользователь добавлен с Membership.CreateUser (EmailAddressTextBox.Text.Trim(), PasswordTextBox.Text, EmailAddressTextBox.Text.Trim()) ;. Я пытался указать, что пользователь должен существовать, если письмо было отправлено, потому что оно вытаскивало адрес электронной почты из таблиц Membership. –

+0

И да, я регистрирую все ошибки в файле global.asax, и их не было обнаружено. –

0

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

  1. (не чаще, чем это было бы легко для вас месте и вы бы поймали его сейчас) код для отправки электронной почты выполняется перед сохранением в базе данных.

  2. (более вероятно) Существует ошибка в обработке ошибок, что позволит электронной почты для отправки даже если DB спасбросок по ошибке, например:

    попробовать

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

Спасибо за ответ. Я пытался указать, что пользователь должен существовать, если письмо было отправлено, потому что оно вытаскивало адрес электронной почты из таблиц Membership. Кроме того, электронное письмо отправляется после сохранения базы данных, и если возникло исключение, оно было бы поймано и зарегистрировано в файле global.asax. –

Смежные вопросы