如何在Web API控制器中获取基本URL?


Answers:


44

您可以使用()中的VirtualPathRoot属性HttpRequestContextrequest.GetRequestContext().VirtualPathRoot


11
Request.GetRequestContext().VirtualPathRoot返回/。我使用Owin在Windows服务的本地主机上自托管Web API。在这种情况下有什么方法可以获取基本URL?谢谢。
Nikolai Samteladze 2013年

1
嗯..这应该返回正确的虚拟路径。我现在亲自尝试过,效果很好。您能否分享您如何设置虚拟路径(例如,我这样做:using (WebApp.Start<Program>("http://localhost:9095/Test"))VirtualPathRoot返回/Test
Kiran Challa 2013年

3
好的,这很有道理。我设置http://localhost:5550/并正确返回/。我的意思是http://localhost:5550/在这种情况下如何获得...
Nikolai Samteladze

6
好的,由于您有权访问HttpRequestMessage(Request.RequestUri),因此可以获取它的请求uri并找到方案,主机和端口...对吗?
Kiran Challa

12
新的Uri(Request.RequestUri,
RequestContext.VirtualPathRoot

86

在对网址的请求的操作方法“ http:// localhost:85458 / api / ctrl / ”中

var baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) ;

这会让你 http:// localhost:85458


6
这是不正确的,仅当您将站点作为IIS中的根站点运行时,它才起作用。如果您在另一个应用程序(例如localhost:85458 / Subfolder / api / ctrl)中运行应用程序,则将产生错误的答案(它不应该包含“ / Subfolder”)。
仲裁人


16

这是我用的:

Uri baseUri = new Uri(Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.PathAndQuery, String.Empty));

然后,当我将其与另一个相对路径结合使用时,将使用以下内容:

string resourceRelative = "~/images/myImage.jpg";
Uri resourceFullPath = new Uri(baseUri, VirtualPathUtility.ToAbsolute(resourceRelative));

10

我将此服务注入到控制器中。

 public class LinkFactory : ILinkFactory
 {
    private readonly HttpRequestMessage _requestMessage;
    private readonly string _virtualPathRoot;


    public LinkFactory(HttpRequestMessage requestMessage)
    {
        _requestMessage = requestMessage;
        var configuration = _requestMessage.Properties[HttpPropertyKeys.HttpConfigurationKey] as HttpConfiguration;
        _virtualPathRoot = configuration.VirtualPathRoot;
        if (!_virtualPathRoot.EndsWith("/"))
        {
            _virtualPathRoot += "/";
        }
    }

    public Uri ResolveApplicationUri(Uri relativeUri)
    {

        return new Uri(new Uri(new Uri(_requestMessage.RequestUri.GetLeftPart(UriPartial.Authority)), _virtualPathRoot), relativeUri);
    }

}

以及如何注入HttpRequestMessage?
理查德·萨雷

1
@RichardSzalay Autofac内置了它,github.com/autofac/Autofac/blob/master/Core/Source/… 但一般的想法是您设置一个DI容器,然后使用消息处理程序获取HttpRequestMessage并将其注册到每个请求处理程序。
Darrel Miller 2014年


4
new Uri(Request.RequestUri, RequestContext.VirtualPathRoot)

4

在.NET Core WebAPI(3.0及更高版本)中:

var requestUrl = $"{Request.Scheme}://{Request.Host.Value}/";


     

2

首先,您使用来获得完整的URL, HttpContext.Current.Request.Url.ToString();然后使用Replace(“ user / login”,“”)来替换方法url。

完整的代码将是

string host = HttpContext.Current.Request.Url.ToString().Replace("user/login", "")

2

在ASP.NET Core中,ApiControllerRequest属性仅是消息。但是仍然Context.Request可以从中获得期望的信息。我个人使用此扩展方法:

public static string GetBaseUrl(this HttpRequest request)
{
    // SSL offloading
    var scheme = request.Host.Host.Contains("localhost") ? request.Scheme : "https";
    return $"{scheme}://{request.Host}{request.PathBase}";
}


1

基于Athadu的答案,我编写了一个扩展方法,然后在Controller Class中,您可以通过以下方式获取根url: this.RootUrl();

public static class ControllerHelper
{
    public static string RootUrl(this ApiController controller)
    {
        return controller.Url.Content("~/");
    }
}

0

发送GET到页面,然后回复的内容就是答案。基本网址:http://website/api/




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.