如何在静态方法中检索.net核心中的当前应用程序根URL?

时间:2018-04-11 17:49:52

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

我目前正在使用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创建扩展方法是处理这种情况的最佳方法吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

您还可以直接为HttpRequest类定义扩展方法,并使用BuildAbsolute类的UriHelper方法构建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
}

答案 1 :(得分:-1)

您可以将扩展方法写入控制器或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();
    }

确保在您的通话代码中导入扩展方法的命名空间