【问题标题】:How to retrieve current application root URL in .net core within a static method?如何在静态方法中检索 .net 核心中的当前应用程序根 URL?
【发布时间】:2018-09-21 17:16:30
【问题描述】:

我目前正在使用 Request.Scheme 和 Request.Host 来组合 Uri 对象,以便为我的 .net 核心 MVC 应用程序获取 AbsoluteUri。

Uri location = new Uri($"{Request.Scheme}://{Request.Host}");
string applicationRootURL = location.AbsoluteUri;

但这仅适用于非静态方法。

由于我需要在另一个控制器中重复使用此方法,我正在考虑将此操作方法设为静态。如果我这样做,编译器会抱怨 Request.Scheme 和 Request.Host。

我想知道我还有哪些其他选择可以实现这一目标?

谢谢。

更新:

这就是我对带有 ActionMethodA 的 ControllerA 所拥有的

public class ControllerA
{
    public bool ActionMethodA()
    {
        Uri location = new Uri($"{Request.Scheme}://{Request.Host}");
        string applicationRootURL = location.AbsoluteUri;

        return false;
    }
}

而在另一个ControllerB中,我想ActionMethodB从ControllerA调用ActionMethodA:

public class ControllerB
{
    public void ActionMethodB()
    {
        var result = ActionMethodA();
    }
}

为ControllerA创建一个扩展方法是处理这种情况最合适的方法吗?

谢谢。

【问题讨论】:

标签: asp.net-core .net-core asp.net-core-mvc uri asp.net-core-2.0


【解决方案1】:

也可以直接为HttpRequest类定义扩展方法,使用UriHelper类的BuildAbsolute方法构建uri。

public static class HttpRequestExtensions
{
    public static string GetURI(this HttpRequest request)
    {
        return UriHelper.BuildAbsolute(request.Scheme, request.Host);
    }
}

并使用它:

public IActionResult ContollerMethod()
{
    var uri = Request.GetURI();

    // your code
}

【讨论】:

  • 谢谢。我想要的是使 ControllerMethod 是静态的,所以在另一个 Controller 中,我可以调用这个 ControllerMethod 像 var result = ControllerMethod();直接地。有可能吗?
  • @XiaoHan 静态方法中没有请求对象的实例引用。所以我认为这是不可能的。
  • 谢谢。有没有其他方法可以在静态方法中获取应用程序 URL?
  • @XiaoHan 在无参数静态方法中?我认为没有其他方法可以实现它。
  • 不一定,可以传任何参数。
【解决方案2】:

您可以将扩展方法写入控制器或 HttpContext 对象。在以下示例中,我向控制器添加了扩展方法。

 public static class ControllerExtensions
{
    public static string GetURI(this Controller controller)
    {
        Uri location = new Uri($"{ controller.Request.Scheme}://{controller.Request.Host}");
        string applicationRootURL = location.AbsoluteUri;
        return applicationRootURL;
    }
}

扩展方法编写完成后,您可以通过以下方式调用它。

public IActionResult Index()
    {
        var url = this.GetURI();
        return View();
    }

确保在调用代码中导入扩展方法的命名空间

【讨论】:

  • 如果我想让 Index() 静态,它还能工作吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 2020-12-16
  • 2019-04-17
  • 1970-01-01
  • 2020-02-15
  • 2017-10-25
相关资源
最近更新 更多