我知道可以使用Url.Link()
获取特定路由的URL,但在Web API控制器中如何获取Web API基本URL?
我知道可以使用Url.Link()
获取特定路由的URL,但在Web API控制器中如何获取Web API基本URL?
在请求到URL "http://localhost:85458/api/ctrl/" 的动作方法中。
var baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) ;
这个将会让你得到 http://localhost:85458
Url.Content("~/")
对我很有效!
HttpRequestContext
(request.GetRequestContext().VirtualPathRoot
)的VirtualPathRoot
属性。Request.GetRequestContext().VirtualPathRoot
返回 /
。我在使用Owin在Windows服务中托管Web API时自己搭建了本地主机。有没有办法获取基本的URL?谢谢。 - Nikolai Samteladzeusing (WebApp.Start<Program>("http://localhost:9095/Test"))
,其中VirtualPathRoot返回/Test
) - Kiranhttp://localhost:5550/
并且它正确地返回 /
。我的意思是如何在这种情况下获取 http://localhost:5550/
... - Nikolai SamteladzeRequest.RequestUri
),那么您可以获取其请求URI,并找到方案、主机和端口,对吗? - Kiran在 .NET Core WebAPI(3.0 及以上版本)中:
var requestUrl = $"{Request.Scheme}://{Request.Host.Value}/";
Request
的依赖关系是什么? - Jannick Breunis这是我使用的:
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));
我将这个服务注入到我的控制器中。
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);
}
}
Url.Link("DefaultApi", new { controller = "Person", id = person.Id })
new Uri(Request.RequestUri, RequestContext.VirtualPathRoot)
ApiController
的Request
属性只是消息。但仍然有一个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}";
}
首先,您可以使用HttpContext.Current.Request.Url.ToString();
获取完整的URL,然后使用Replace("user/login", "")替换您的方法URL。
完整代码如下:
string host = HttpContext.Current.Request.Url.ToString().Replace("user/login", "")