ユーザーのサインインにフォーム認証を使用して、IIS 7.5 で動作する Silverlight アプリケーションを実行しています。RequiresAuthentication を使用して保護されている RIA サービスと、そうでない ErrorHandlingService および LoggingService があります。
最近、ErrorHandlingService へのリクエストが 50 pr のオーダーでスパムされているようです。2 番目 - IIS ログに次の出力が生成されます。
2013-10-01 11:19:12 xxx.xxx.xxx.xxx POST ...ErrorService.svc - 80 - xxx.xxx.xxx.xxx Mozilla/4.0+(互換;+MSIE+8.0;+Windows+NT) +6.1;+Trident/4.0;+SLCC2;+.NET+CLR+2.0.50727;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729;+Media+Center+PC+6.0; +.NET4.0C;+.NET4.0E;+InfoPath.2;+MS-RTC+LM+8) 403 6 5 15
セットアップについてもう少し詳しく説明します
。ErrorHandlingService には、データベース内のテーブルに例外情報を記録する Exception ラッパー クラスを受け入れる単一のメソッドがあり、LoggingService は LogMessage と同じ例外ラッパーを受け入れ、メッセージをNLog を使用したファイル。保護されたサービスで例外が発生すると、Silverlight クライアントはまず ErrorHandlingService を呼び出して例外を記録し、その後 LoggingService を呼び出して例外をファイルに記録します。
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ErrorHandlingService : IErrorHandlingService
{
public string RecordError(ExceptionTransport error)
{
if (error == null)
{
return null;
}
var hex = HandMadeException.CreateFrom(error);
var res = DiagnosticsHandler.DefaultInstance.HandleException(hex);
var fb = res.GetFeedBack(DatabaseSink.FeedBackEntryId);
var dbId = "";
if (fb != null)
{
dbId = fb.ToString();
}
return dbId;
}
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class LoggingService : ILoggingService
{
private static NLog.Logger _logger = NLog.LogManager.GetLogger("Trace");
public void LogError(LogMessage message, ExceptionTransport error)
{
string log = message.Message;
if (error != null)
{
log = string.Format("{0}: {1}", log, error.ToString());
}
switch (message.Level)
{
case LogLevel.Trace:
_logger.Trace(log);
break;
case LogLevel.Debug:
_logger.Debug(log);
break;
case LogLevel.Info:
_logger.Info(log);
break;
case LogLevel.Warning:
_logger.Warn(log);
break;
case LogLevel.Error:
_logger.Error(log);
break;
case LogLevel.Fatal:
_logger.Fatal(log);
break;
}
}
}
public class ErrorHandlingService : ErrorService, IErrorHandler
{
private LogHandlingService _loggingService = new LogHandlingService();
public ErrorHandlingService()
: base(WcfWebUtility.CreateFactory<IErrorHandlingService>("xxxxErrorHandlingService"))
{
}
public bool HandleError(Exception error)
{
base.RecordError(error, OnErrorRecorded, false);
}
private void LogError(Exception error, string errorId, bool showUserMessage)
{
_loggingService.Log(string.Format("Error '{0}' occured on Ecofleet v. '{1}' for user '{2}'", errorId, ProductVersion.GetEcofleetVersion(), AutologUser.Current), Autolog.DiagnosticsService.Logging.LogLevel.Error, error);
}
private void OnErrorRecorded(ErrorResult result)
{
bool showUserMessage = false;
if (result.UserState is bool)
{
showUserMessage = (bool)result.UserState;
}
LogError(result.ErrorRecorded, result.ErrorId, showUserMessage);
}
... Shortened for brevity
}
これが起こっていることです:
- IIS のログ出力には、ErrorHandlingService への大量の要求が表示されますが、LoggingService への要求はありません。
- エラー パラメータが null であることを示唆するものは何もデータベースに入力されません。
- アプリケーションは正常に動作し、エラーについて不満を言うユーザーはいません。私は、ユーザーが 55 個のエラーを受け取ることを期待しています。次に、サポート部門に連絡するか、少なくともログオフします...
- ほとんどの場合、クライアントの IP アドレスは同じままのようです。
それで、それはおそらく(悪意のある)攻撃ですか?または、クライアントのバージョンの不一致である可能性があります (新しいバージョンが展開され、クライアントがそれをダウンロードしない場合、新しいサーバーに対して古いクライアント バージョンを実行しているのでしょうか?)? または、他の何か ... ?