Многочисленные ошибки в C # asp.net windows service - PullRequest
0 голосов
/ 27 февраля 2010

Я создал следующую службу Windows C # для отправки электронной почты всем подписавшимся пользователям моего сайта asp.net 3.5 (C #), ежедневно и / или еженедельно в зависимости от типа подписки.

using System;
using System.Security;
using System.Web;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Net.Mail;
using System.Data.SqlClient;
using System.Configuration;
using System.Threading;
using System.Timers;
using System.Runtime.Remoting.Messaging;

namespace AutoEmailService
{
    public partial class AutoEmailService : ServiceBase
    {
        private System.ComponentModel.IContainer components = null;
        private System.Timers.Timer Timer;
        public AutoEmailService()
        {
            InitializeComponent();   <-- this one
        }

        // The main entry point for the process
        static void Main()
        {
            System.ServiceProcess.ServiceBase[] ServicesToRun;
            ServicesToRun = new System.ServiceProcess.ServiceBase[] 
            {
                new AutoEmailService()
            };
            ServiceBase.Run(ServicesToRun);
        }

        private void InitializeComponent()
        {
            this.Timer = new System.Timers.Timer();
            ((System.ComponentModel.ISupportInitialize)(this.Timer)).BeginInit();
            this.Timer.Interval = 60000;
            this.Timer.Elapsed += new System.Timers.ElapsedEventHandler(this.Timer_Elapsed);
            this.ServiceName = "AutomaticEmailService";
            ((System.ComponentModel.ISupportInitialize)(this.Timer)).EndInit();
        }
        /// <summary>
        /// Clean up any resources being used. 
        /// </summary>
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose(); <-- this
                }
            }
            base.Dispose(disposing);
        }

        protected override void OnStart(string[] args)
        {
            this.Timer.Enabled = true;
            LogMessage.LogMessages("Service Started"); <-- this
        }

        protected override void OnStop()
        {
            Timer.Enabled = false;
            LogMessage.LogMessages("Service Stopped"); <-- this
        }

        // Respond to the Elapsed event of the timer control 
        private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            //add a log entry to windows log to check windows service current position/activity
            LogMessage.LogMessages("Service Running"); <-- this
            if (DateTime.Now.ToString("hh tt") == "05 PM")
            {
                List DailySubscription = new List();
                DataSet dataset = new DataSet();
                DataSet ArticlesDataSet = new DataSet();
                int subscriptionType = 0;
                string strArticleHeading = null;
                DateTime currentDate = DateTime.Now.Date;

                //Get all the subscribed users
                SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SELECT SubType, Email FROM ArticleSubscription WHERE SubType > 0", Conn);
                sqlDataAdapter.Fill(dataset);

                //Seprate users on the bases of their subscription type 
                foreach (DataRow dr in dataset.Tables[0].Rows)
                {
                    subscriptionType = Convert.ToInt32(dr["SubType"].ToString());
                    if (subscriptionType == 1 || subscriptionType == 3)
                    {
                        DailySubscription.Add(dr["Email"].ToString());
                    }
                }

                // get all today's articles 
                SqlDataAdapter sqlArticlesDataAdapter = new SqlDataAdapter();
                SqlCommand Command = new SqlCommand("SELECT articleheading FROM Articles WHERE postedDate %LIKE% @currentDate", Conn);
                Command.Parameters.Add("@currentDate", SqlDbType.NVarChar);
                Command.Parameters["@currentDate"].Value = DateTime.Now.Date;
                sqlArticlesDataAdapter.SelectCommand = Command;
                sqlArticlesDataAdapter.Fill(dealsDataSet);

                //copy all the articles to a string 
                foreach (DataRow dr in dealsDataSet.Tables[0].Rows)
                {
                    strArticleHeading = strArticleHeading + dr["articleheading"].ToString();
                }

                //send emails to all subscribers 
                foreach (string email in DailySubscription)
                {
                    MailMessage mail = new MailMessage(); mail.From = new MailAddress("123@mywebsite.com", "My Web Site");
                    mail.To.Add(new MailAddress(email.ToString()));
                    mail.Subject = "Today's Articles";
                    mail.IsBodyHtml = true;
                    mail.Body = strArticleHeading;
                    System.Net.Mail.SmtpClient SmtpMail = "IP Address";
                    SmtpMail.Send(mail); <-- this
                }
            }

            if (DateTime.Now.ToString("hh tt") == "07 PM" && DateTime.Now.DayOfWeek.ToString("dddd") == "Friday")
            {
                List WeeklySubscription = new List();
                DataSet dataset = new DataSet();
                int subscriptionType = 0;
                DataSet articlesDataSet = new DataSet();
                string strArticleHeading = null;

                //Get all the subscribed users
                SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SELECT SubType, Email FROM ArticleSubscription WHERE SubType > 0", Conn);
                sqlDataAdapter.Fill(dataset);

                //Seprate users on the bases of their subscription type 
                foreach (DataRow dr in dataset.Tables[0].Rows)
                {
                    subscriptionType = Convert.ToInt32(dr["SubType"].ToString());
                    if (subscriptionType == 2 || subscriptionType == 3)
                    {
                        WeeklySubscription.Add(dr["Email"].ToString());
                    }
                }

                // get all articles of this week 
                SqlDataAdapter sqlArticlesDataAdapter = new SqlDataAdapter();
                SqlCommand Command = new SqlCommand("SELECT articleheading FROM Articles WHERE postedDate >= @currentDate", Conn);
                Command.Parameters.Add("@currentDate", SqlDbType.NVarChar);
                Command.Parameters["@currentDate"].Value = DateTime.Now.Date.AddDays(-7);
                sqlArticlesDataAdapter.SelectCommand = Command;
                sqlArticlesDataAdapter.Fill(articlesDataSet);

                //copy all the articles to a string 
                foreach (DataRow dr in dealsDataSet.Tables[0].Rows)
                {
                    strArticleHeading = strArticleHeading + dr["articleheading"].ToString();
                }

                //send emails to all subscribers 
                foreach (string email in WeeklySubscription)
                {
                    MailMessage mail = new MailMessage();
                    mail.From = new MailAddress("123@mywebsite.com", "My Web Site");
                    mail.To.Add(new MailAddress(email.ToString()));
                    mail.Subject = "This week's Articles";
                    mail.IsBodyHtml = true;
                    mail.Body = strArticleHeading;
                    System.Net.Mail.SmtpClient SmtpMail = "IP Address";
                    SmtpMail.Send(mail); <-- this
                }
            }
        }
    }
}

Я пометил строки <-- this, где произошли ошибки, и описание этих ошибок выглядит следующим образом

  1. Вызов неоднозначен между следующими методами или свойствами AutoEmailService.AutoEmailService.InitializeComponent () и AutoEmailService.AutoEmailService.InitializeComponent ()

  2. Имя LogMessage не существует в текущем контексте.

  3. компонентов, этот член определен более одного раза. Ошибка: неоднозначность между AutoEmailService.AutoEmailService.components и AutoEmailService.AutoEmailService.components

  4. SmtpMail в этом контексте не существует. Это ошибки и их описание, которые есть у этой оконной службы. Если кто-нибудь знает их исправление, пожалуйста, дайте мне знать об этом.

Также дайте мне знать, каковы будут настройки SMTP для этой службы Windows, поскольку она будет работать на выделенном сервере. Кроме того, если кто-нибудь обнаружит любую другую логическую, а также программную ошибку / ошибку в этой службе Windows, пожалуйста, дайте мне знать об этом. На самом деле это первая служба Windows, которую я сделал, поэтому я хочу, чтобы вы, люди, вручную отлаживали ее со мной.

Ответы [ 3 ]

4 голосов
/ 27 февраля 2010

Вот ваши ответы.

  1. Так как вы объявили частичный класс, я предполагаю, что редактор Visual Studio объявил для вас файл .Designer.cs с components, Dispose и InitializeComponents. Вам нужно выяснить, почему вы добавили их самостоятельно, и решить, оставить ли те, которые вы добавили, или использовать те, которые дизайнер добавил для вас. Это позаботится о неоднозначном коде.
  2. Класс SmtpMail находится в пространстве имен System.Web.Mail, поскольку его нет в директивах using в верхней части кода, компилятор не может его найти. Добавьте правильный оператор использования.
  3. LogMessage Я понятия не имею, что, я думаю, это класс, который у вас есть в вашем проекте, посмотрите, нужно ли вам добавить директиву using для этого.
  4. Настройки отправки SMTP для выделенного сервера, единственный человек, который может сказать вам, что это человек, который настроил сервер. Возможно, существует служба SMTP, работающая локально, и в этом случае вы, вероятно, захотите установить свой IP-адрес как localhost, но вам может потребоваться пройти аутентификацию с ним.

Кроме того, вот общий совет, когда вы задаете вопросы (о переполнении стека и других местах). Постарайтесь быть максимально конкретным. Сброс всего файла кода, перечисление 4+ проблем, а затем закрытие вашего вопроса с помощью « Кроме того, если кто-нибудь обнаружит любые другие логические, а также программные ошибки / ошибки в этой службе Windows », почти гарантирует вам мало кто будет смотреть на это. Кроме того, вы узнаете, как правильно форматировать код и списки, чем меньше времени вы тратите на обеспечение качества вашего вопроса, тем меньше времени люди будут вкладывать в его помощь.

1 голос
/ 27 февраля 2010

Попробуйте отформатировать ваш код.Кроме этого:

System.Net.Mail.SmtpClient SmtpMail = "IP Address";

Вы пытаетесь присвоить строку переменной типа SmtpClient.

0 голосов
/ 27 февраля 2010

Этот код ошибки:

//send emails to all subscribers 
            foreach (string email in DailySubscription)
            {
                MailMessage mail = new MailMessage(); mail.From = new MailAddress("123@mywebsite.com", "My Web Site");
                mail.To.Add(new MailAddress(email.ToString()));
                mail.Subject = "Today's Articles";
                mail.IsBodyHtml = true;
                mail.Body = strArticleHeading;
                System.Net.Mail.SmtpClient SmtpMail = "IP Address";
                SmtpMail.Send(mail); <-- this
            }

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

Проверьте это и дайте мне знать, у меня была такая же проблема.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...