Идти как
getRepositoryManager().loadAllPcbDetails()
.flatMapIterable {
listPcbDetail-> listPcbDetail
// listPcbDetail is ArrayList<PcbDetails>
// Converts your list of ids into an Observable
// which emits every item in the list
}
.flatMap { pcbDetail ->
// pcbDetail is PcbDetails
getRepositoryManager().loadAllPcbs(pcbDetail.pcbIdList)
}.subscribe { listPcb ->
// listPcb is ArrayList<Pcb>
}
Здесь точно такая же ситуация. Запуск ELMAH для всех наших веб-приложений. Некоторые из них имеют планировщики на основе консоли.
После некоторого покопания в исходном коде, следующий код, похоже, работает:
ErrorLog errorLog = ErrorLog.GetDefault(null);
errorLog.ApplicationName = "/LM/W3SVC/1/ROOT/AppName";
errorLog.Log(new Error(ex));
Единственная реальная проблема с вышеизложенным заключается в том, что вам нужно сохранить имя приложения где-нибудь в вашей конфигурации, чтобы иметь возможность видеть записи в программе просмотра ELMAH.axd.
Итак, в нашем общем коде обработки ошибок мы делаем:
if (HttpContext.Current != null)
ErrorSignal.FromCurrentContext().Raise(ex);
else
{
ErrorLog errorLog = ErrorLog.GetDefault(null);
errorLog.ApplicationName = ErrorHandling.Application;
errorLog.Log(new Error(ex));
}
Редактировать : Это МОЖЕТ быть сделано - См. этот ответ.
Я почти уверен, что вы не можете этого сделать , Я постараюсь выкопать соответствующий материал.
Итак, из чего я можно найти поиск в группе Google, что это невозможно ... Поскольку ELMAH работает с HttpHandlers (конструкция asp.net), это только ASP.NET.
С учетом сказанного, есть способы, которыми вы можете использовать его в консольном приложении. ELMAH предоставляет метод для возникновения ошибок, поэтому вы можете заключить ELMAH в свою обработку исключений, а затем сигнализировать об ошибке через:
ErrorSignal.FromCurrentContext().Raise(new NotSupportedException());
Это будет означать, что все ваше приложение будет заключено в обработчик исключений и сигнализацию. Вам может потребоваться некоторая настройка, чтобы это исправить, но я думаю, что это вполне возможно.
Если вам это нужно, это ссылка на репозиторий кода ELMAH .
ELMAH означает модули регистрации ошибок и обработчики - конечно, имея в виду IHttpModule
и IHttpHandler
.
Консольные приложения не используют HTTP , поэтому, как правило, не сможет получить большую пользу от модулей и обработчиков, созданных для HTTP.
В дополнение к нашему сайту ASP.NET нам нужна была возможность входа из консольного приложения и службы Windows. Я использовал ответ ( ErrorLog.GetDefault (null);
), который работал хорошо, пока мне тоже не потребовалось отправить электронное письмо.
Итак, вот мое решение. Он обрабатывает журнал, электронную почту, твиты и фильтрацию (как в файле конфигурации, так и в коде). Я также заключил основной вызов в расширение Exception, чтобы его можно было вызывать так: catch (Exception ex) {ex.LogToElmah (); }
Для фильтрации в коде перехватите соответствующее событие .Filtering: ElmahExtension.ErrorLog.Filtering + = new ExceptionFilterEventHandler (ErrorLog_Filtering);
Код:
using System;
using System.Web;
using Elmah;
namespace System
{
public static class ElmahExtension
{
public static void LogToElmah(this Exception ex)
{
if (HttpContext.Current != null)
{
ErrorSignal.FromCurrentContext().Raise(ex);
}
else
{
if (httpApplication == null) InitNoContext();
ErrorSignal.Get(httpApplication).Raise(ex);
}
}
private static HttpApplication httpApplication = null;
private static ErrorFilterConsole errorFilter = new ErrorFilterConsole();
public static ErrorMailModule ErrorEmail = new ErrorMailModule();
public static ErrorLogModule ErrorLog = new ErrorLogModule();
public static ErrorTweetModule ErrorTweet = new ErrorTweetModule();
private static void InitNoContext()
{
httpApplication = new HttpApplication();
errorFilter.Init(httpApplication);
(ErrorEmail as IHttpModule).Init(httpApplication);
errorFilter.HookFiltering(ErrorEmail);
(ErrorLog as IHttpModule).Init(httpApplication);
errorFilter.HookFiltering(ErrorLog);
(ErrorTweet as IHttpModule).Init(httpApplication);
errorFilter.HookFiltering(ErrorTweet);
}
private class ErrorFilterConsole : ErrorFilterModule
{
public void HookFiltering(IExceptionFiltering module)
{
module.Filtering += new ExceptionFilterEventHandler(base.OnErrorModuleFiltering);
}
}
}
}
Кроме того, вам нужно будет добавить ссылку в System.Web.dll
в вашем проекте, чтобы это работало.
ИЗМЕНИТЬ : Согласно комментариям, этот код будет отправлять электронные письма только в том случае, если в вашем конфигурационном файле есть
. Обратитесь к этому фрагменту кода , если вы хотите сохранить
в вашем файле конфигурации (для использования, когда доступен HttpContext.Current).