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

Nik*_*dze 68 url base-url asp.net-web-api asp.net-web-api2

我知道我可以Url.Link()用来获取特定路由的URL,但是如何在Web API控制器中获取Web API基本URL?

mLa*_*Lar 73

在对url" http:// localhost:85458/api/ctrl / " 的请求的action方法中

var baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) ;
Run Code Online (Sandbox Code Playgroud)

这将得到你 http:// localhost:85458

  • 这是不正确的,只有当您将站点作为IIS中的根站点运行时才会起作用.如果你在另一个应用程序中运行你的应用程序,即http:// localhost:85458/Subfolder/api/ctrl,那么这将产生错误的答案(它不包括它应该的"/ Subfolder"). (4认同)

Kir*_*lla 43

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

  • `Request.GetRequestContext().VirtualPathRoot`返回`/`.我使用Owin在Windows服务中的localhost上自托管Web API.在这种情况下获取基本URL的任何方法?谢谢. (10认同)
  • 新的Uri(Request.RequestUri,RequestContext.VirtualPathRoot) (8认同)
  • 好的,既然您可以访问HttpRequestMessage(`Request.RequestUri`),您可以获取它的请求uri并找到方案,主机和端口......对吗? (6认同)
  • 好的,这是有道理的.我设置`http:// localhost:5550 /`并正确返回`/`.我的意思是如何在这种情况下获得`http:// localhost:5550 /` (3认同)
  • Request.GetRequestContext().VirtualPathRoot 在 netcore 1.6.1 上不起作用,因为 HttpRequestContext 在那里不存在,还有其他选择吗? (2认同)

Ath*_*adu 35

Url.Content("~/")
Run Code Online (Sandbox Code Playgroud)

为我工作!

  • 适用于 .Net Core 2.2 (2认同)

Dav*_*tin 15

这是我使用的:

Uri baseUri = new Uri(Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.PathAndQuery, String.Empty));
Run Code Online (Sandbox Code Playgroud)

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

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


Dar*_*ler 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);
    }

}
Run Code Online (Sandbox Code Playgroud)


Gok*_*ath 9

在 .NET Core WebAPI(3.0 及以上版本)中:

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


     
Run Code Online (Sandbox Code Playgroud)


Raf*_*aeu 8

使用Url帮助程序类中的以下代码段

Url.Link("DefaultApi", new { controller = "Person", id = person.Id })
Run Code Online (Sandbox Code Playgroud)

完整的文章可在此处获取:http: //blogs.msdn.com/b/roncain/archive/2012/07/17/using-the-asp-net-web-api-urlhelper.aspx

这是官方的方式,不需要任何帮助或解决方法.如果你看一下这种方法就像ASP.NET MVC


Moo*_*tom 5

new Uri(Request.RequestUri, RequestContext.VirtualPathRoot)
Run Code Online (Sandbox Code Playgroud)