2016-10-11 7 views
7

Требование:Ошибка при отправке электронной почты с помощью почтового MVC?

Отправить электронную почту всем пользователям динамически каждый день в определенное время, скажем, 6:00 AM.

То, что я сделал до сих пор:

Я использую библиотеку третьей стороны под названием Quartz.net из NuGet.

public class TaskScheduler : IJob 
{ 
    public void Execute(IJobExecutionContext context) 
    { 
     try { 
      UserRepository userRepo = new UserRepository(); 
      var users = userRepo.GetUsers(); 

      DashBoardRepository repo = new DashBoardRepository(); 
      foreach (var rec in users) 
      { 
       var tasks = repo.GetIncompleteTasks(rec.UserID); 
       var appointments = repo.GetUpcomingAppointments(rec.UserID); 

       if (tasks.Count > 0 || appointments.Count > 0) 
       { 
        dynamic email = new Email("TaskEmail"); 
        email.To = rec.Email; 
        email.From = "[email protected]"; 
        email.Subject = "Pending items in XYZ"; 
        email.Tasks = tasks; 
        email.Appointments = appointments; 
        email.Send(); 
       } 
      } 
     } 
     catch(Exception ex) 
     { 
      clsLog.LogMessageToFile(ex.ToString()); 
     } 
    } 
} 

public static class JobScheduler 
{ 
    public static void Start() 
    { 
     IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); 
     scheduler.Start(); 

     IJobDetail job = JobBuilder.Create<TaskScheduler>().Build(); 

     ITrigger trigger = TriggerBuilder.Create() 
      .WithDailyTimeIntervalSchedule 
       (s => 
       s.WithIntervalInHours(24) 
       .OnEveryDay() 
       .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(6, 0)) 
      ) 
      .Build(); 

     scheduler.ScheduleJob(job, trigger); 
    } 
} 

protected void Application_Start() 
    {   
     JobScheduler.Start(); 
    } 

Я использую Postal в MVC для отправки электронной почты.

Это прекрасно работает в моем локальном режиме, если я запускаю из своей Visual Studio. Но как только я развожу его на IIS, я получаю ошибку ниже:

System.ArgumentException: The virtual path '/' maps to another application, which is not allowed. 
    at System.Web.CachedPathData.GetVirtualPathData(VirtualPath virtualPath, Boolean permitPathsOutsideApp) 
    at System.Web.HttpContext.GetFilePathData() 
    ------------- 

Я размещаю это приложение как вспомогательную директорию в IIS. Так что это что-то вроде http://www.maindemosite.com/xyz

enter image description here

Web.Config:

<?xml version="1.0" encoding="utf-8"?> 
<!-- 
    For more information on how to configure your ASP.NET application, please visit 
    http://go.microsoft.com/fwlink/?LinkId=301880 
    --> 
<configuration> 
    <configSections> 
    <section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
    <section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5v361934e089" requirePermission="false" /> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    </configSections> 
    <connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-XYZ-201405202911.mdf;Initial Catalog=aspnet-XYZ-20140534102911;Integrated Security=True" providerName="System.Data.SqlClient" /> 
    <add name="XYZEntities" connectionString="metadata=res://*/DAL.XYZEntities.csdl|res://*/DAL.XYZEntities.ssdl|res://*/DAL.XYZEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SERVER\MSSQL;initial catalog=XYZTest;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 
    <appSettings> 
    <add key="webpages:Version" value="3.0.0.0" /> 
    <add key="webpages:Enabled" value="false" /> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
    <add key="AuthenticationSlide" value="100" /> 
    <add key="DocumentsPath" value="C:/Users/KKK/Documents/Documents/" /> 
    <add key="XYZDeployment" value="http://localhost:51641" /> 
    </appSettings> 
    <system.identityModel.services> 
    <federationConfiguration> 
     <cookieHandler requireSsl="false" name="ABCAuthorization" /> 
    </federationConfiguration> 
    </system.identityModel.services> 
    <system.net> 
    <mailSettings> 
     <smtp> 
     <network host="smtp.ABC.com" port="25" userName="[email protected]" password="[email protected]" /> 
     </smtp> 
    </mailSettings> 
    </system.net> 
    <system.identityModel> 
    <identityConfiguration> 
     <securityTokenHandlers> 
     <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     <add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     </securityTokenHandlers> 
    </identityConfiguration> 
    </system.identityModel> 
    <system.web> 
    <sessionState mode="InProc" timeout="1" /> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" maxRequestLength="1048576" /> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Account/Login" timeout="2880" /> 
    </authentication> 
    </system.web> 
    <system.webServer> 
    <security> 
     <requestFiltering> 
     <requestLimits maxAllowedContentLength="1073741824" /> 
     </requestFiltering> 
    </security> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </modules> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="OPTIONSVerbHandler" /> 
     <remove name="TRACEVerbHandler" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers></system.webServer> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.AspNet.Identity.Core" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.Practices.Unity" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="4.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v11.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 
    <system.serviceModel> 
    <bindings /> 
    <client /> 
    </system.serviceModel> 
</configuration> 

Полное сообщение об ошибке:

Log Entry : 10:09:40 AM Friday, October 14, 2016 
    : 
    :System.ArgumentException: The virtual path '/' maps to another application, which is not allowed. 
    at System.Web.CachedPathData.GetVirtualPathData(VirtualPath virtualPath, Boolean permitPathsOutsideApp) 
    at System.Web.HttpContext.GetFilePathData() 
    at System.Web.Configuration.RuntimeConfig.GetConfig(HttpContext context) 
    at System.Web.Configuration.HttpCapabilitiesBase.GetBrowserCapabilities(HttpRequest request) 
    at System.Web.HttpRequest.get_Browser() 
    at System.Web.HttpRequestWrapper.get_Browser() 
    at System.Web.WebPages.BrowserHelpers.GetOverriddenBrowser(HttpContextBase httpContext, Func`2 createBrowser) 
    at System.Web.WebPages.DisplayModeProvider.<.ctor>b__2(HttpContextBase context) 
    at System.Web.WebPages.DisplayModeProvider.<GetAvailableDisplayModesForContext>d__4.MoveNext() 
    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__DisplayClass6.<FindView>b__4(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 Postal.EmailViewRenderer.CreateView(String viewName, ControllerContext controllerContext) 
    at Postal.EmailViewRenderer.Render(Email email, String viewName) 
    at Postal.EmailService.Send(Email email) 
    at XYZ.Utilities.TaskScheduler.Execute(IJobExecutionContext context) in D:\Applications\XYZ\Utilities\TaskScheduler.cs:line 33 
+0

Пожалуйста, напишите ваш web.config –

+0

Опубликовано web.config – sony

+0

Пытаться изменить C:/Users/KKK/Документы/Документы/в каталог по заявке или проверить, существует ли доступ к iis пользователю. –

ответ

0

Согласно этому вопросу: Postal Issue #65, кажется, которые есть у тебя HttpContext.Current содержит значение null при попытке получить относительный путь к корневому каталогу вашего проекта на сервере развертывания IIS. Здесь был контрольный список, чтобы сделать:

  1. Попробуйте переставить JobScheduler.Start() метод из Application_Start к Application_AuthenticateRequest вызова метода во время запуска приложения. AFAIK, метод Application_Start не содержит HttpContext.Current экземпляр как Application_AuthenticateRequest имеет.

    protected void Application_AuthenticateRequest() 
    { 
        JobScheduler.Start(); 
    } 
    
  2. Проверьте, установлен ли ваш сервер развертывания IIS в интегрированном режиме. В этом режиме Application_Start не содержит HttpContext.Current из-за изменений дизайна интегрированного конвейера. Как Майк Володарский сказал:

В принципе, если вы будете получать доступ к контексту запроса в Application_Start, у вас есть два варианта:

  1. Измените код приложения, чтобы не использовать контекст запроса (рекомендуемые).
  2. Переместите приложение в классический режим (НЕ рекомендуется).

Первый выбор означает, что он был несколько альтернатив подле Application_AuthenticateRequest, который использует Application_BeginRequest или любые другие методы событий, которые включают в себя HttpContext.Current экземпляра.

  1. Если используется абсолютный путь, проверьте, существует ли он на сервере развертывания. Относительный путь более предпочтителен в файле web.config, таким образом, вы можете изменить пути, как это:

    <add key="DocumentsPath" value="~/Documents/Documents/" /> 
    

Затем убедитесь Application_Start метод не содержит какой-либо другой метод, который содержит HttpContext.Current экземпляр, включая контекст базы данных если таковые имеются.

Ссылки:

Why is HttpContext.Current null?

IIS7 Integrated mode: Request is not available in this context exception in Application_Start

Связанные проблемы:

Request is not available in this context

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