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

在中创建相对URLasp.net未经请求的Web窗体自定义类

  •  6
  • Waleed  · 技术社区  · 6 年前

    这里的问题是我没有在web请求方法中生成url,或者我没有访问请求对象的权限。URL需要在自定义类中生成,该类是线程化的,即不在web请求中。

    HostingEnvironment.MapPath("test.aspx");
    VirtualPathUtility.ToAbsolute("123.aspx");
    HttpContext.Current.Request.Url.Authority;
    

    3 回复  |  直到 6 年前
        1
  •  4
  •   Reza Aghaei    6 年前

    如果你的方法不能使用 HttpContext.Current.Request.Url ,例如,如果是后台计划任务,则可以使用以下选项之一:

    • 如果您的代码托管在同一个ASP.NET应用程序,您可以在第一个请求中将站点的站点域名传递给您的类。为此,您需要处理 Application_BeginRequest 事件并从中获取域 然后将其传递给类,或者将其存储在应用程序范围存储中。您可以在中找到一个实现 this post article .
      注意:代码在SO中可用,所以我不重复代码

    • 如果您的代码不是托管在同一个ASP.NET如果你不想依赖 应用程序启动请求 ,作为另一个选项,您可以将站点域名存储在设置中(如中的appsettigs)应用条件或者web.config文件如果是web应用程序)并在代码中使用它。

        2
  •  0
  •   VDWWD    6 年前

    string domain = "www.productionurl/123.aspx";
    
    if (Dns.GetHostName() == "Development")
    {
        domain = "www.developmenturl/123.aspx";
    }
    

    这个 Dns.GetHostName() 不是唯一的检查方法。你也可以用 HostingEnvironment.ApplicationPhysicalPath

        3
  •  0
  •   Paul Keister    6 年前

    我的答案是:不要这样做。您正在构建一个分布式系统,尽管它很简单,但一般来说,在分布式系统中引入服务之间的耦合是有问题的。因此,即使可以使用Application\u BeginRequest为域播种,您也可以将批处理作业的行为绑定到您的网站。有了这种安排,就有传播错误的风险,而且会使系统的部署更加复杂。

    研究这个问题的一个更好的方法是认识到核心需求是将生产站点的绑定与批处理作业中使用的URL同步。在许多情况下,在应用程序配置你的批量将是最好的解决方案,真的没有任何需要引入代码,除非你知道你的网址将经常改变,或者你需要扩展到许多不同的任意网址。如果您需要支持以编程方式更改URL,我建议您考虑设置像Consul这样的分布式配置系统,并从部署系统中读取IIS绑定和应用程序配置为您的批处理创建文件。因此,即使在这个高级场景中,批处理和网站之间也没有直接的交互。