2016-02-14 6 views
2

Я пытаюсь использовать Postal на моем сайте MVC5. Когда я разместить свой сайт дочерний сайт т.е. http://localhost/Subsite я получаю ошибкуИспользование почтовых ящиков и профайлов в подсайтах

  • виртуальный путь «/» карты на другое приложение, которое не допускается

Я отлажена его вниз, когда Создается ControllerContext, HttpContext не устанавливается корректно. Поскольку я запускаю Postal from Hangfire, HttpContext.Current всегда имеет значение null. Postal создает ContollerContext, используя следующий код.

 ControllerContext CreateControllerContext() 
    { 
     // A dummy HttpContextBase that is enough to allow the view to be rendered. 
     var httpContext = new HttpContextWrapper(
      new HttpContext(
       new HttpRequest("", UrlRoot(), ""), 
       new HttpResponse(TextWriter.Null) 
      ) 
     ); 
     var routeData = new RouteData(); 
     routeData.Values["controller"] = EmailViewDirectoryName; 
     var requestContext = new RequestContext(httpContext, routeData); 
     var stubController = new StubController(); 
     var controllerContext = new ControllerContext(requestContext, stubController); 
     stubController.ControllerContext = controllerContext; 
     return controllerContext; 
    } 

    string UrlRoot() 
    { 
     var httpContext = HttpContext.Current; 
     if (httpContext == null) 
     { 
      return "http://localhost"; 
     } 

     return httpContext.Request.Url.GetLeftPart(UriPartial.Authority) + 
       httpContext.Request.ApplicationPath; 
    } 

Как я могу указать UrlRoot так, что вместо того, чтобы тянуть значение по умолчанию локального хоста, чтобы тянуть это основано на моем дочернем?

ответ

0

Ниже приведено другое возможное решение, которое я считаю более элегантным, чем указано выше. Он также устраняет проблему, возникающую при доступе к приложению MVC во время выполнения фонового процесса.

public static void SendTypedEmailBackground() 
{ 
    try 
    { 
     var engines = new ViewEngineCollection(); 
     var viewsPath = Path.GetFullPath(HostingEnvironment.MapPath(@"~/Views/Emails")); 

     var eng = new FileSystemRazorViewEngine(viewsPath); 
     engines.Add(eng); 

     var email = new WebApplication1.Controllers.EmailController.TypedEmail(); 
     email.Date = DateTime.UtcNow.ToString(); 
     IEmailService service = new Postal.EmailService(engines); 
     service.Send(email); 

    } 
    catch(Exception ex) 
    { 
     throw ex; 
    } 
} 
+0

Спасибо за это. Я получаю сообщение об ошибке (не могу преобразовать null в 'bool', потому что это тип значения, не допускающий значения null). Любая идея, почему это произойдет? – TsTeaTime

1

Я следил за указаниями здесь http://docs.hangfire.io/en/latest/tutorials/send-email.html, чтобы отправить электронное письмо. Метод в учебнике ниже

public static void NotifyNewComment(int commentId) 
{ 
// Prepare Postal classes to work outside of ASP.NET request 
var viewsPath = Path.GetFullPath(HostingEnvironment.MapPath(@"~/Views/Emails")); 
var engines = new ViewEngineCollection(); 
engines.Add(new FileSystemRazorViewEngine(viewsPath)); 

var emailService = new EmailService(engines); 

// Get comment and send a notification. 
using (var db = new MailerDbContext()) 
{ 
    var comment = db.Comments.Find(commentId); 

    var email = new NewCommentEmail 
    { 
     To = "[email protected]", 
     UserName = comment.UserName, 
     Comment = comment.Text 
    }; 

    emailService.Send(email); 
} 
} 

Я обнаружил, что проблема в том, что FileSystemRazorViewEngine не используется BTY почтовый. Чтобы это получилось, я должен был убедиться, что FileSystemRazorViewEngine был первым движком в доступном состоянии. Затем я удалил его, потому что я не хотел, чтобы он был механизмом по умолчанию. Ниже приведен мой обновленный метод.

public static void NotifyNewComment(int commentId) 
{ 
// Prepare Postal classes to work outside of ASP.NET request 
var viewsPath = Path.GetFullPath(HostingEnvironment.MapPath(@"~/Views/Emails")); 
var eng = new FileSystemRazorViewEngine(viewsPath)); 
ViewEngines.Engines.Insert(0, eng); 

var emailService = new EmailService(engines); 

// Get comment and send a notification. 
using (var db = new MailerDbContext()) 
{ 
    var comment = db.Comments.Find(commentId); 

    var email = new NewCommentEmail 
    { 
     To = "[email protected]", 
     UserName = comment.UserName, 
     Comment = comment.Text 
    }; 

    emailService.Send(email); 
    ViewEngines.Engines.RemoveAt(0) 
} 
}