2013-10-24 3 views
1

У меня есть ASP.NET MVC веб-приложение и некоторые внешние хроны называют конкретный URL из моего CronJobController и выполнить конкретный метод, как:Почему я получаю «Значение не входит в ожидаемый диапазон»?

/// <summary> 
    /// Will be called externally by www.setcronjob.com. 
    /// </summary> 
    /// <returns></returns> 
    public async Task<ActionResult> Index() 
    { 
     RunTwitterSearchQuery(); 
     RunFacebookSearchQuery(); 
     return new ContentResult { Content = "Ok" }; 
    } 

в RunTwitterSearchQuery, я хочу, чтобы отправить несколько писем, и я попытался как с MvcMailer и ActionMailer, например (с ActionMailer):

var mailController = new MailController(); 
mailController.HttpContextBase = this.HttpContext; 
mailController.MoreThanXFollowersEmail(alertEmailModel).Deliver(); 

Поскольку контекст HTTP является нулевым, я должен установить его таким образом, чтобы избежать NPE, но после того, что я получаю очень странное исключение (в обоих MvcMailer и ActionMailer):

System.ArgumentException: Value does not fall within the expected range. 
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) 
     at System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(Int32 errorCode) 
     at System.Web.Hosting.IIS7WorkerRequest.GetUserAgentInternal() 
     at System.Web.Hosting.IIS7WorkerRequest.GetKnownRequestHeader(Int32 index) 
     at System.Web.HttpRequest.get_UserAgent() 
     at System.Web.HttpRequestWrapper.get_UserAgent() 
     at System.Web.WebPages.BrowserHelpers.GetOverriddenUserAgent(HttpContextBase httpContext) 
     at System.Web.WebPages.BrowserHelpers.GetOverriddenBrowser(HttpContextBase httpContext, Func`2 createBrowser) 
     at System.Web.WebPages.BrowserHelpers.GetOverriddenBrowser(HttpContextBase httpContext) 
     at System.Web.WebPages.DisplayModeProvider.<.ctor>b__2(HttpContextBase context) 
     at System.Web.WebPages.DefaultDisplayMode.CanHandleContext(HttpContextBase httpContext) 
     at System.Web.WebPages.DisplayModeProvider.<>c__DisplayClass6.<GetAvailableDisplayModesForContext>b__5(IDisplayMode mode) 
     at System.Linq.Enumerable.WhereListIterator`1.MoveNext() 
     at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
     at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
     at System.Web.Mvc.VirtualPathProviderViewEngine.GetPath(ControllerContext controllerContext, String[] locations, String[] areaLocations, String locationsPropertyName, String name, String controllerName, String cacheKeyPrefix, Boolean useCache, String[]& searchedLocations) 
     at System.Web.Mvc.VirtualPathProviderViewEngine.FindView(ControllerContext controllerContext, String viewName, String masterName, Boolean useCache) 
     at System.Web.Mvc.ViewEngineCollection.<>c__DisplayClassc.<FindView>b__a(IViewEngine e) 
     at System.Web.Mvc.ViewEngineCollection.Find(Func`2 lookup, Boolean trackSearchedPaths) 
     at System.Web.Mvc.ViewEngineCollection.FindView(ControllerContext controllerContext, String viewName, String masterName) 
     at ActionMailer.Net.Mvc.EmailResult.LocateViews(ControllerContext context) in c:\Dev\actionmailer\src\ActionMailer.Net.Mvc\EmailResult.cs:line 127 
     at ActionMailer.Net.Mvc.EmailResult.AddMessageViews(ControllerContext context) in c:\Dev\actionmailer\src\ActionMailer.Net.Mvc\EmailResult.cs:line 155 
     at ActionMailer.Net.Mvc.EmailResult.ExecuteResult(ControllerContext context) in c:\Dev\actionmailer\src\ActionMailer.Net.Mvc\EmailResult.cs:line 98 
     at ActionMailer.Net.Mvc.MailerBase.Email(String viewName, Object model, String masterName, Boolean trimBody) in c:\Dev\actionmailer\src\ActionMailer.Net.Mvc\MailerBase.cs:line 166 
     at SocialCrm.Controllers.MailController.MoreThanXFollowersEmail(AlertEmailModel model) in c:\dev\palminfo\SocialCrm\SocialCrm\Controllers\MailController.cs:line 18 
     at SocialCrm.Controllers.CronJobController.SendAlertEmail(SearchResultModel searchResultModel, Int32 searchQueryId, List`1 alerts, String emailTo, String streamName) in c:\dev\palminfo\SocialCrm\SocialCrm\Controllers\Batch\CronJobController.cs:line 146 
     at SocialCrm.Controllers.CronJobController.<RunTwitterSearchQuery>b__3() in c:\dev\palminfo\SocialCrm\SocialCrm\Controllers\Batch\CronJobController.cs:line 83 

Это очень уродливо, и я был бы очень признателен за любую помощь по этой проблеме.

Обновление: при использовании MvcMailer this - это ошибка, которую я получаю.

+0

Наиболее очевидная вещь, которую я вижу, это убедиться, что 'searchQueryId' является допустимой строкой Int32, а не Int64, и т. Д. –

+0

@ChrisPratt Да, это , например, я тестирую с помощью 'searchQueryId = 1'. Я чувствую, что проблема в основном связана с тем, что httpContext пропускает некоторые поля при использовании в этом асинхронном режиме ... –

+0

Привет @Cristian Boariu, смогли ли вы его решить? Я сталкиваюсь с тем же вопросом с ActionMailer. – GurjeetSinghDB

ответ

0

Попробуйте решение, отправленное на github, для очень похожего вопроса, если вы используете MvcMailer. Решением было создать новый UserMailer каждый раз, когда отправляется электронное письмо: Github Answer

+0

Пробовал это тоже, и это не помогает. –

Смежные вопросы