8

C#アプリケーションの作成者として、例外ログまたはデバッグログにアクセスできれば、ユーザーから報告された問題のトラブルシューティングがはるかに簡単になることがわかりました。

ユーザーがオンまたはオフにできる自家製のロギングメカニズムを含めました。ユーザーがインターネット経由でログを送信できるようにして、エラーのログを確認できるようにします。

SMTPClientまたはWebサービスのいずれかを使用して情報を送信することを考えました。ファイアウォールが送信SMTPアクセスをブロックする可能性があるため、SMTPClientが機能しない可能性があります。Webサービスは、大量のデータ(1 MB以上の可能性がある)の送信に問題がありますか?

アプリケーションがレビューのためにエラーレポートを開発者に直接送信するための最良の方法として、何をお勧めしますか?

編集:説明:これはWindowsアプリケーションであり、エラーが発生したときに、エラーの送信を求めるダイアログを表示したいと思います。私の質問は、インターネットを介してアプリケーションから私(開発者)にエラーログを送信するメカニズムについてです。

4

6 に答える 6

3

あなたがそれをするつもりであることをユーザーに知らせる何らかの方法。彼らにプロキシを求めたり、電子メールサーバーを求めたりします。

あなたがソケットなどを開いていて、通知なしにデータを送信していることを彼らが発見した場合、セキュリティ志向の人は本当に神経質になります。

そして当然そうです。

于 2009-05-24T03:01:52.097 に答える
3

すべて(アプリケーションの監査全体)を送信しないことをお勧めします。
ただし、ユーザーが希望する場合([フィードバック]ボタン)、またはアプリケーションに明示的な例外、致命的なエラー、問題の状態がある場合。

Webサービスと電子メール(SMTPClient)の両方を使用しました。これらについての私の考え

Webサービス
GOOD

  • ユーザーごとに特別な構成はありません
  • サイズ制限、5Mb以上-8MBのメールが可能

悪い

  • 公開されています(ハッカーはこれらのもので遊ぶのが好きです)
  • dbバックエンドを使用してWebサービスを作成するための追加の開発
  • 後で追加のフィールドを作成するのは悪いことです
  • Webサービスの変更は良くありません!

SMTPクライアント
GOOD

  • ユーザーごとに特別な構成はありません
  • パブリックフォルダにログインすると、検索/フィルタが簡単になります(グループ化、...)
  • 送信可能なすべてのデータ、スクリーンショット、スタックトレース、ユーザー設定、...-
    > HTML
  • HTMLメールを使用したため、ログの形式と情報の変更は簡単です。

悪い

  • ユーザーごとの特別な構成(SMTPサーバー、電子メールユーザー、...)
  • メールのサイズ制限(5MB-8MB ??)
  • メールのdbにログを記録するには、多くの開発が必要です
于 2009-05-24T04:17:41.357 に答える
2

自分で作成することも、 log4netのようなものを使用することもできます。これにより、例外ロギングが処理されます...

于 2009-05-24T03:01:29.400 に答える
2

私が働いている場所では3つの方法を使用しています

  • 専用メールボックスへの SMTP。これには、多くの構成と「大企業」の IT 部門とのやり取りが必要であり、メール サーバーとは何か、それに対して認証して送信する方法を理解する必要があります。次に、Norton Internet Security のような、クライアント マシンで送信 SMTP トラフィックをブロックできるプログラムがあり、余分なスパナが発生します。
  • サーバー上の asmx への送信。これは私たちが推奨する方法ですが、多くのことが邪魔になる可能性があります。主にプロキシですが、Norton が介入して攻撃することもできます。プロキシが関係している場合は、逃げて逃げてください:-)
  • HttpWebRequest と multipart/form-encoded の mime typ を使用した HTTP POST。プロキシとファイアウォールの問題もありますが、asmx 送信が失敗した場合に機能することがあります。

幸運を。おっしゃる通り、スタック トレースがあればデバッグがはるかに簡単です。

于 2009-05-24T03:36:37.117 に答える
0

私はこのようなものを専用のメールボックスへの電子メールとして受け取るのが好きです。そうすれば、簡単にアーカイブしたり、検索したり、無視したりできます。

クライアント/送信者側では、ログを送信するためのポップアップを提供することは良い考えだと思います。Windowsの場合は、MAPIを使用してメールを送信できます。UNIXシステムでは、「メール」の問題はほとんどのシステムで機能します。

確認メッセージでユーザーに電子メールアドレスの入力を求めることができ、送信方法に関するいくつかのオプションを提供することもできます(選択したメールクライアントへのコピー/貼り付けを含む)。

してはいけないことの1つは、ユーザーの許可なしに情報を送信することです。

于 2009-05-24T03:13:05.070 に答える
0

1 日にそれほど多くのレポートが送信されるとは思わない場合は、gmail アカウントを作成し、それを使用して電子メールを送信し、ユーザーに SMTP サーバーの構成を強制する必要を回避できます。これを行うためのGmailの利用規約が何であるかわかりません。

これは、Gmailアカウントを使用してメールを送信する、私が書いたクラスです...

明らかに、誰かがあなたのGmailアカウントにアクセスできる可能性があるなど、セキュリティ上の問題がいくつかあります. だから、それを考慮してください。

このクラスには、電子メールを同期的または非同期的に送信するためのメソッドがあります。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Collections;
using System.Text;
using System.Net;
using System.Net.Mail;
using System.Net.Mime; 
//Mime is Not necerrary if you dont change the msgview and 
//if you dont add custom/extra headers 
using System.Threading;
using System.IO;
using System.Windows.Forms; // needed for MessageBox only.



namespace BR.Util
{
    public class Gmailer
    {

        SmtpClient client = new SmtpClient();
        static String mDefaultToAddress = "yourToAddress@yourdomain.com";
        static String mDefaultFromAddress = "anonymous@gmail.com";
        static String mDefaultFromDisplayName = "Anonymous";

        String mGmailLogin = "someaccount@gmail.com";
        String mGmailPassword = "yourpassword";


        public Gmailer()
        {
            client.Credentials = new System.Net.NetworkCredential(mGmailLogin, mGmailPassword);
            client.Port = 587;           
            client.Host = "smtp.gmail.com";
            client.EnableSsl = true;
            client.SendCompleted += new SendCompletedEventHandler(Gmailer_DefaultAsyncSendCompletedHandler);
        }

        public void setSendCompletedHandler(SendCompletedEventHandler pHandler)
        {
            client.SendCompleted -= Gmailer_DefaultAsyncSendCompletedHandler;
            client.SendCompleted += pHandler;
        }

        /// <summary>
        /// Static method which sends an email synchronously.
        /// It uses a hardcoded from email.
        /// </summary>
        /// <returns></returns>
        public static bool quickSend(String toEmailAddress, String subject, String body)
        {
            return Gmailer.quickSend(toEmailAddress, mDefaultFromAddress, mDefaultFromDisplayName, subject, body);
        }

        /// <summary>
        /// Static method which sends an email synchronously.
        /// It uses the hardcoded email address.
        /// </summary>
        /// <returns>true if successful, false if an error occurred.</returns>
        public static bool quickSend(String toEmailAddress, String fromEmailAddress,
                                     String fromDisplayName, String subject, String body)
        {
            try
            {
                Gmailer gmailer = new Gmailer();
                System.Net.Mail.MailMessage mailMsg = gmailer.createMailMessage(toEmailAddress, fromEmailAddress, fromDisplayName, subject, body);
                gmailer.send(mailMsg);
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }

        // <summary> creates a MailMessage object initialized with the default values.</summary>
        public System.Net.Mail.MailMessage createMailMessage()
        {
            return createMailMessage(mDefaultToAddress, mDefaultFromAddress, mDefaultFromDisplayName, mDefaultEmailSubject, mDefaultEmailBody);
        }

        public System.Net.Mail.MailMessage createMailMessage(String toEmailAddress, String fromEmailAddress, 
                                                             String fromDisplayName, String subject, String body)
        {
            //Build The MSG
            System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
            msg.To.Add(toEmailAddress);
            msg.From = new MailAddress(fromEmailAddress, fromDisplayName, System.Text.Encoding.UTF8);
            msg.Subject = subject;
            msg.SubjectEncoding = System.Text.Encoding.UTF8;
            msg.Body = body;
            msg.BodyEncoding = System.Text.Encoding.UTF8;
            msg.IsBodyHtml = false;
            msg.Priority = MailPriority.High;
            return msg;
        }

        public System.Net.Mail.MailMessage addAttachmentToMailMessage(System.Net.Mail.MailMessage msg, String attachmentPath)
        {
            msg.Attachments.Add(new Attachment(attachmentPath));
            return msg;
        }

        // <summary> method which blocks until the MailMessage has been sent.  Throws
        // System.Net.Mail.SmtpException if error occurs.</summary>
        public void send(System.Net.Mail.MailMessage pMailMessage)
        {
            //try {
                client.Send(pMailMessage);
            //}
            //catch (System.Net.Mail.SmtpException ex)
            //{
            //    MessageBox.Show(ex.Message, "Send Mail Error");
            //}
        }

        // 
        public void sendAsync(System.Net.Mail.MailMessage pMailMessage)
        {
            object userState = pMailMessage;
            try
            {
                MailSent = false;
                client.SendAsync(pMailMessage, userState);
            }
            catch (System.Net.Mail.SmtpException ex)
            {
                MessageBox.Show(ex.Message, "Send Mail Error");
            }
        }

        // <summary> 
        // Provides a default SendComplete handler which is activated when an AsyncCompletedEvent 
        // is triggered by the private client variable.  This is useful for debugging etc.
        // Use the method setSendCompletedHandler to define your own application specific handler.
        // That method also turns this handler off.
        // </summary>
        public void Gmailer_DefaultAsyncSendCompletedHandler(object sender, AsyncCompletedEventArgs e)
        {
            MailMessage mail = (MailMessage)e.UserState;
            string subject = mail.Subject;

            if (e.Cancelled)
            {
                string cancelled = string.Format("[{0}] Send canceled.", subject);
                MessageBox.Show(cancelled);                
            }
            if (e.Error != null)
            {
                string error = String.Format("[{0}] {1}", subject, e.Error.ToString());
                MessageBox.Show(error);                
            }
            else
            {
                MessageBox.Show("Message sent.");
            }
            MailSent = true;
        }


        private bool _MailSent = false;
        /// <summary>
        /// Set to false when an async send operation is started and is set to true when finished.
        /// </summary>
        public bool MailSent
        {
            set
            {
                _MailSent = value;
            }
            get
            {
                return _MailSent;
            }
        }
    }
}
于 2009-06-19T08:27:43.117 に答える