SmtpPickupDirAppender не содержит определения для SmtpHost и нет доступного метода расширения SmtpHost, принимающего первый аргумент. - PullRequest
0 голосов
/ 11 июля 2020

У меня есть этот фрагмент кода в. net проекте библиотеки классов фреймворка, я хочу повторно использовать его в. net проекте стандартной библиотеки классов. Он работает должным образом, но выдает ошибку компиляции в. net стандартном проекте.

foreach (AppenderElement element in FX_CONNECT.EmailElement.Appenders)
{
    var smtpElement = (log4net.Appender.SmtpPickupDirAppender)AppLogger.Logger.Repository.GetAppenders().Where(appender => appender.Name.Equals(element.Name)).FirstOrDefault();
    if (smtpElement != null)
    {
        smtpElement.From = FX_CONNECT.EmailElement.From;
        smtpElement.To = FX_CONNECT.EmailElement.To;
        smtpElement.SmtpHost = FX_CONNECT.EmailElement.Server;
    }
}

Ошибка для smtpElement.SmtpHost:

Ошибка CS1061 'SmtpPickupDirAppender' не содержит определение для SmtpHost и отсутствие доступного метода расширения SmtpHost, принимающего первый аргумент типа SmtpPickupDirAppender (отсутствует ли у вас директива using или ссылка на сборку?)

log 4net версия в обоих приложениях 2.0.8.

Я искал на inte rnet, но не понял, как решить эту проблему, пожалуйста, помогите.

Я просмотрел log 4net официальный сайт, он не поддерживает. net стандарт на данный момент.

https://logging.apache.org/log4net/release/framework-support.html

Итак, есть ли обходной путь для решения этой проблемы ?

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Я не понимаю, почему вы говорите, что проблема связана со стандартом. net. В документации из SmtpPickupDirAppender говорится:

/// The configuration for this appender is identical to that of the <c>SMTPAppender</c>,
/// except that instead of specifying the <c>SMTPAppender.SMTPHost</c> you specify 
/// <see cref="PickupDir"/>.

Это приложение не работает с хостом Smtp, а работает с каталогом файловой системы. Вам необходимо установить свойство PickupDir.

Замените SmtpPickupDirAppender на SmtpAppender, если вы хотите отправлять электронные письма на реальные, или замените

smtpElement.SmtpHost = FX_CONNECT.EmailElement.Server;

на

smtpElement.PickupDir = "C:\YourPickUpDir";

на случай, если вы захотите продолжить использование этого приложения.

0 голосов
/ 11 июля 2020

Спасибо @Claudio Redi за ваш комментарий, это дало мне правильное направление для решения проблемы.

Я добавил в свой проект класс ниже и использовал класс SMTPAppender вместо log4net.Appender.SmtpPickupDirAppender в строке var smtpElement = (SMTPAppender)AppLogger.Logger.Repository.GetAppenders().Where(appender => appender.Name.Equals(element.Name)).FirstOrDefault(); , и он работает должным образом.

using log4net.Appender;
using log4net.Core;
using System.IO;
using System.Net.Mail;

namespace FxCore.Diagnostics.Components
{
    public class SMTPAppender : BufferingAppenderSkeleton
    {
        public string To { get; set; }
        public string From { get; set; }
        public string Subject { get; set; }
        public string SmtpHost { get; set; }
        public string Port { get; set; }

        protected void SendEmail(string messageBody)
        {
            SmtpClient client = new SmtpClient(SmtpHost);
            client.UseDefaultCredentials = false;
            client.Port = int.Parse(Port);
            using (MailMessage mailMessage = new MailMessage())
            {
                mailMessage.From = new MailAddress(From);
                mailMessage.To.Add(To);
                mailMessage.Body = messageBody;
                mailMessage.Subject = Subject;
                client.Send(mailMessage);
            }
        }

        protected override bool RequiresLayout => true;

        protected override void SendBuffer(LoggingEvent[] events)
        {
            StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);

            string t = Layout.Header;
            if (t != null)
            {
                writer.Write(t);
            }

            for (int i = 0; i < events.Length; i++)
            {
                // Render the event and append the text to the buffer
                RenderLoggingEvent(writer, events[i]);
            }

            t = Layout.Footer;
            if (t != null)
            {
                writer.Write(t);
            }

            SendEmail(writer.ToString());
        }
    }
}
...