代码之家  ›  专栏  ›  技术社区  ›  GeorgeB

虚拟路径“/”映射到另一个应用程序,这是不允许的。MVC和Hangfire

  •  4
  • GeorgeB  · 技术社区  · 6 年前

    我尝试了stackoverflow上发布的其他解决方案,但没有发现任何有效的解决方案,这是我的问题。

    因此,我想通过我的MVC应用程序使用hangfire发送电子邮件,这在我的本地计算机上运行,但当我将其上载到远程服务器时,我在hangfire上遇到以下错误:

    The virtual path '/' maps to another application, which is not allowed
    

    这是我用来发送电子邮件的代码:

    foreach (var EmailEntry in EmailEntries)
            {
                var email = new EmailTemplateModel
                {
                    ViewName = "EmailTemplateModel",
                    FromAddress = "donotreply@emailservice.com",
                    EmailAddress = EmailEntry,
                    Subject = "Task Report",
                    Date = Dates,
                    Task = DatesAndTasks,
                };
                email.Send();
            }
    

    当我使用“ViewName”方法时,它会在本地计算机上返回“~/视图/电子邮件”。

    Send()方法内部:

    // Summary:
            //     Convenience method that sends this email via a default EmailService.
            public void Send();
    

    IIS中的应用程序结构:

    服务器(>);站点(>);默认值(>);我的应用程序

    JodyL解决方案提出的问题如下:

    StructureMapDependencyScope.get_CurrentNestedContainer() 
    

    enter image description here

    解决方案:

    在“StructureMappDependencyScope”类中编辑了以下代码:

    之前:

    public IContainer CurrentNestedContainer {
                get {
                    return (IContainer)HttpContext.Items[NestedContainerKey];
                }
                set {
                    HttpContext.Items[NestedContainerKey] = value;
                }
            }
    

    之后:

    public IContainer CurrentNestedContainer {
                get {
                    IContainer container = null;
                    if (HttpContext != null)
                        container = (IContainer)HttpContext.Items[NestedContainerKey];
                    return container;
                }
                set {
                    HttpContext.Items[NestedContainerKey] = value;
                }
            } 
    

    之前:

    private HttpContextBase HttpContext {
                get {
                    var ctx = Container.TryGetInstance<HttpContextBase>();
                    return ctx ?? new HttpContextWrapper(System.Web.HttpContext.Current);
                }
            }
    

    之后:

    private HttpContextBase HttpContext {
                get {
                    var ctx = Container.TryGetInstance<HttpContextBase>();
                    if (ctx == null && System.Web.HttpContext.Current == null)
                        return null;
    
                    return ctx ?? new HttpContextWrapper(System.Web.HttpContext.Current);
                }
            } 
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   JodyL    6 年前

    造成此问题的原因可能是Postal在使用Hangfire时无法使用HTTPContext。如果是HTTPContext。当前为空,邮政使用 http://localhost 作为URL,它不会映射到您的应用程序位置。为了解决这个问题,可以在发送电子邮件时使用FileSystemRazorViewEngine,并将其传递给电子邮件模板的路径。

    有关如何实现此目标的详细信息,请参阅此问题的答案。 Using Postal and Hangfire in Subsite

        2
  •  0
  •   Murat Yıldız    6 年前

    最有可能的问题是与IIS有关,而不是与Hangfire等有关。因此,请尝试使用dot(.)如下所示:

    而不是使用

    '~/Views/Emails'
    

    试试这个

    './Views/Emails'
    

    同样,在显示图像时也可能遇到一些问题,在这种情况下,您应该进行以下更改:

    ~/../Content/images/image.png
    

    ./../Content/images/image.png
    

    希望这有帮助。。。

        3
  •  0
  •   Niladri    6 年前

    请尝试使用 MapPath 具体如下:

    var path = HostingEnvironment.MapPath(@"~/Views/Emails");