【问题标题】:How to get base URL in Web API controller?如何在 Web API 控制器中获取基本 URL?
【发布时间】: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


    【解决方案1】:

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

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

    这会给你http://localhost:85458

    【讨论】:

    • 这是不正确的,它仅在您将站点作为 IIS 中的根站点运行时才会起作用。如果您在另一个应用程序中运行您的应用程序,即localhost:85458/Subfolder/api/ctrl,那么这将产生错误的答案(它不会包含它应该包含的“/Subfolder”)。
    【解决方案2】:
    Url.Content("~/")
    

    为我工作!

    【讨论】:

    • 我来这里是为了这个答案 :)
    • 适用于 .Net Core 2.2
    【解决方案3】:

    您可以使用来自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/...
    • 好的,既然你可以访问 HttpRequestMessage(Request.RequestUri),你可以获取它的请求 uri 并找到方案、主机和端口......对吗?
    • 新 Uri(Request.RequestUri, RequestContext.VirtualPathRoot)
    【解决方案4】:

    这是我用的:

    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));
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

         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?
        • @RichardSzalay Autofac 内置了它,github.com/autofac/Autofac/blob/master/Core/Source/… 但总体思路是您设置一个 DI 容器,然后使用消息处理程序获取 HttpRequestMessage 并将其注册到每个请求处理程序中。
        【解决方案7】:

        使用 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

        【讨论】:

        • 在 Azure 上使用自定义域时,Url.Link 返回的是 .websites 域而不是自定义域,这是为什么呢?
        【解决方案8】:
        new Uri(Request.RequestUri, RequestContext.VirtualPathRoot)
        

        【讨论】:

          【解决方案9】:

          在 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}";
          }
          

          【讨论】:

            【解决方案10】:

            不确定这是否是 Web API 2 的补充,但 RequestContext 有一个 Url 属性,即 UrlHelperHttpRequestContext Properties。它有LinkContent 方法。详情here

            【讨论】:

              【解决方案11】:

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

              完整的代码将是

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

              【讨论】:

                【解决方案12】:

                根据Athadu的回答,我写了一个扩展方法,然后在Controller Class中你可以通过this.RootUrl();获取root url

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

                【讨论】:

                  【解决方案13】:

                  向页面发送GET,回复的内容将是answer.Base url:http://website/api/

                  【讨论】:

                    【解决方案14】:
                    1. 添加对 System.Web 的引用 using System.Web;

                    2. 获取你想要的 url 的主机或任何其他组件 string host = HttpContext.Current.Request.Url.Host;

                    【讨论】:

                    • 这不适用于 .net core 5
                    【解决方案15】:

                    Al WebApi 2,只是调用HttpContext.Current.Request.Path;

                    【讨论】:

                      【解决方案16】:

                      来自HttpRequestMessage

                      request.Headers.Host
                      

                      【讨论】:

                        猜你喜欢
                        • 2021-04-08
                        • 2019-11-13
                        • 1970-01-01
                        • 1970-01-01
                        • 2016-07-17
                        • 1970-01-01
                        • 1970-01-01
                        • 2015-08-10
                        • 2016-07-15
                        相关资源
                        最近更新 更多