Asp.net web api 在ApiController外部的asp.net web api中生成资源的url

Asp.net web api 在ApiController外部的asp.net web api中生成资源的url,asp.net-web-api,Asp.net Web Api,正在寻找在asp.net web api中为特定资源构造或生成url的方法。它可以在控制器中完成,因为它继承自ApiController,因此您可以获得UrlHelper 我希望在ApicController的上下文之外构建资源url 我不确定ApicController,因为我以前没有使用过它。这对你来说可能是多余的,但再一次,它可能不是。查看您的Global.asax.cs文件,特别是registerOutes函数。最初,您应该看到以下映射: routes.MapRoute ("Defa

正在寻找在asp.net web api中为特定资源构造或生成url的方法。它可以在控制器中完成,因为它继承自ApiController,因此您可以获得UrlHelper


我希望在ApicController的上下文之外构建资源url

我不确定ApicController,因为我以前没有使用过它。这对你来说可能是多余的,但再一次,它可能不是。查看您的Global.asax.cs文件,特别是registerOutes函数。最初,您应该看到以下映射:

  routes.MapRoute ("Default", "{controller}/{action}/{id}", new { controller = "MyController", action = "Index", id = "" });
因此,默认情况下,应用程序设置为按以下格式处理路由:

 {ControllerName}/{ActionName}/{ResourceId}
如下所示设置的控制器类应使您能够接收该格式的请求

 class {ControllerName}Controller : ApiController
 {
      public ActionResult {ActionName} (string id)
      {
           // fetch your resource by its unique identifier
      }
 }

那么UrlHelper类呢:

System.Web.Http.Routing.UrlHelper;
System.Web.Mvc.UrlHelper
MVC one有一些有用的静态方法,可以接受路由信息,也可以将其用作通过在RequestContext中传递而创建的实例(在大多数MVC过滤器和各种其他地方都可用)。实例方法应该正是生成URL所需的方法

HTTP one接受ControllerContext(在大多数HTTP筛选器和各种其他地方也可以使用它)。

以下是我所做的:

  • 需要HttpContext/Request,因此可能无法在应用程序启动中工作
  • 仅在WebApi 1中测试
  • 仅适用于在GlobalConfiguration中注册的路由(但如果您有其他路由,只需将其传入即可)

我试图找到的是一种在ApiController之外获得给定资源的url的方法。基本上基于资源、其Id和一些HttpContext,以编程方式解析该资源的绝对url。这是用于使用asp.net web api创建REST服务。
System.web.Http.Routing.UrlHelper
现在只接受一条
HttpRequestMessage
,它在调用
链接时使用该消息来查找要在生成的Url开头使用的服务器名称/域。
HttpRequestMessage
还被传递到
HttpRouteCollection
GetVirtualPath
方法。因此,似乎
System.Web.Http.Routing.UrlHelper
在这方面对我们没有帮助。考虑到这在当时是完全有效的,对于反对者来说,另一种选择会很好。我会留下这个答案,因为它现在的评论很有价值。谢谢Andrey,我几乎要放弃这个了。事实证明,HttpPropertyKeys.HttpRouteDataKey对于Mvc.UrlHelper是必需的。伟大的“СПаббб”)!当我执行此操作时,会创建UrlHelper,但它会生成Url作为主机名。为了生成正确的主机名,您做了什么类型的配置?有没有办法让它生成https而不是http?@GregVeres您的context.Request.Url中有什么内容?
// given HttpContext context, e.g. HttpContext.Current
var request = new HttpRequestMessage(HttpMethod.Get, context.Request.Url) {
    Properties = {
        { HttpPropertyKeys.HttpConfigurationKey, GlobalConfiguration.Configuration },
        { HttpPropertyKeys.HttpRouteDataKey, new HttpRouteData(new HttpRoute()) },
        { "MS_HttpContext", new HttpContextWrapper(context) }
    }
};

var urlHelper = new UrlHelper(request);