【发布时间】:2013-11-20 21:13:07
【问题描述】:
我知道我可以使用Url.Link() 来获取特定路由的 URL,但是如何在 Web API 控制器中获取 Web API 基本 URL?
【问题讨论】:
标签: url asp.net-web-api base-url asp.net-web-api2
我知道我可以使用Url.Link() 来获取特定路由的 URL,但是如何在 Web API 控制器中获取 Web API 基本 URL?
【问题讨论】:
标签: url asp.net-web-api base-url asp.net-web-api2
在对url“http://localhost:85458/api/ctrl/”的请求的action方法中
var baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) ;
【讨论】:
Url.Content("~/")
为我工作!
【讨论】:
您可以使用来自HttpRequestContext (request.GetRequestContext().VirtualPathRoot) 的VirtualPathRoot 属性
【讨论】:
Request.GetRequestContext().VirtualPathRoot 返回/。我使用 Owin 在 Windows 服务的本地主机上自托管 Web API。在这种情况下有什么方法可以获取基本 URL?谢谢。
using (WebApp.Start<Program>("http://localhost:9095/Test")) 其中 VirtualPathRoot 返回/Test)
http://localhost:5550/,它正确返回/。我的意思是在这种情况下如何获得http://localhost:5550/...
Request.RequestUri),你可以获取它的请求 uri 并找到方案、主机和端口......对吗?
这是我用的:
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));
【讨论】:
在 .NET Core WebAPI(3.0 及以上版本)中:
var requestUrl = $"{Request.Scheme}://{Request.Host.Value}/";
【讨论】:
我将此服务注入到我的控制器中。
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 助手类中的以下 sn-p
Url.Link("DefaultApi", new { controller = "Person", id = person.Id })
全文可在此处获得: http://blogs.msdn.com/b/roncain/archive/2012/07/17/using-the-asp-net-web-api-urlhelper.aspx
这是不需要任何帮助或解决方法的官方方式。 如果你看这种方法就像 ASP.NET MVC
【讨论】:
new Uri(Request.RequestUri, RequestContext.VirtualPathRoot)
【讨论】:
在 ASP.NET Core 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}";
}
【讨论】:
不确定这是否是 Web API 2 的补充,但 RequestContext 有一个 Url 属性,即 UrlHelper:HttpRequestContext Properties。它有Link 和Content 方法。详情here
【讨论】:
首先你得到完整的 URL 使用
HttpContext.Current.Request.Url.ToString(); 然后使用 Replace("user/login", "") 替换您的方法 url。
完整的代码将是
string host = HttpContext.Current.Request.Url.ToString().Replace("user/login", "")
【讨论】:
根据Athadu的回答,我写了一个扩展方法,然后在Controller Class中你可以通过this.RootUrl();获取root url
public static class ControllerHelper
{
public static string RootUrl(this ApiController controller)
{
return controller.Url.Content("~/");
}
}
【讨论】:
向页面发送GET,回复的内容将是answer.Base url:http://website/api/
【讨论】:
添加对 System.Web 的引用
using System.Web;
获取你想要的 url 的主机或任何其他组件
string host = HttpContext.Current.Request.Url.Host;
【讨论】:
Al WebApi 2,只是调用HttpContext.Current.Request.Path;
【讨论】:
来自HttpRequestMessage
request.Headers.Host
【讨论】: