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

Asp.net core 如何在静态方法中检索.NETCore中的当前应用程序根URL?,asp.net-core,.net-core,asp.net-core-mvc,uri,asp.net-core-2.0,Asp.net Core,.net Core,Asp.net Core Mvc,Uri,Asp.net Core 2.0,我目前正在使用Request.Scheme和Request.Host到复合Uri对象来为我的.net核心MVC应用程序获取绝对Uri Uri location = new Uri($"{Request.Scheme}://{Request.Host}"); string applicationRootURL = location.AbsoluteUri; 但这只适用于非静态方法 由于我需要在另一个控制器中重复使用此方法,我正在考虑将此动作方法设置为静态。如果我这样做,编译器会抱怨Request

我目前正在使用Request.Scheme和Request.Host到复合Uri对象来为我的.net核心MVC应用程序获取绝对Uri

Uri location = new Uri($"{Request.Scheme}://{Request.Host}");
string applicationRootURL = location.AbsoluteUri;
但这只适用于非静态方法

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

我想知道我有什么其他的选择来实现这一点

多谢各位

更新:

这就是我为ControllerA提供的ActionMethodA

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的扩展方法是处理这种情况的最合适的方法吗


谢谢。

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

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

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

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

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

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


在HttpContext的扩展方法中生成…抱歉,没有弄清楚如何生成。但是计划在不使方法静态的情况下实现该解决方案。这是HttpContext扩展方法中C Make最基本和最常用的功能之一…抱歉,我不知道如何实现。但是计划在不使方法静态的情况下实现该解决方案。这是C语言中最基本和最常用的特性之一。我想让ControllerMethod成为静态的,所以在另一个控制器中,我可以调用这个ControllerMethod,比如var result=ControllerMethod;直接地可能吗?@XiaoHan静态方法中没有对请求对象的实例引用。所以我认为这是不可能的。谢谢。在静态方法中有没有其他方法可以获取应用程序URL?@XiaoHan在无参数静态方法中?我不认为有任何其他方法可以实现它。不一定,可以传递任何参数。谢谢。我想让ControllerMethod成为静态的,所以在另一个控制器中,我可以调用这个ControllerMethod,比如var result=ControllerMethod;直接地可能吗?@XiaoHan静态方法中没有对请求对象的实例引用。所以我认为这是不可能的。谢谢。在静态方法中有没有其他方法可以获取应用程序URL?@XiaoHan在无参数静态方法中?我不认为有任何其他方法可以实现它。不一定,可以传递任何参数。如果我想使索引静态,它仍然工作吗?如果我想使索引静态,它仍然工作吗?