C# ASP.NET Web API使用url.Action生成url

C# ASP.NET Web API使用url.Action生成url,c#,asp.net-mvc-5,asp.net-web-api2,C#,Asp.net Mvc 5,Asp.net Web Api2,如何在Web Api中生成相同的url var url = Url.Action("Action", "Controller", new { product = product.Id, price = price }, protocol: Request.Url.Scheme); 附言 url应生成到MVC控制器/操作,但应从web api中生成 因此基本上:向myapi/generateurl发出get请求,这将返回一个url: http://domain.com/controller/ac

如何在Web Api中生成相同的url

var url = Url.Action("Action", "Controller", new { product = product.Id, price = price }, protocol: Request.Url.Scheme);
附言

url应生成到MVC控制器/操作,但应从web api中生成

因此基本上:向my
api/generateurl
发出get请求,这将返回一个url:

http://domain.com/controller/action?product=productId&price=100

Web Api控制器中最接近Url.Action的帮助程序可能是Url.Link方法,它将通过路由名称、控制器名称、操作名称和路由参数(如果需要)生成Url

下面是一个简单的例子

默认应用程序启动/RouteConfig.cs

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Web Api控制器:

public class MyWebApiController : ApiController
{
    public string Get()
    {
        var url = this.Url.Link("Default", new { Controller = "MyMvc", Action = "MyAction", param1 = 1, param2 = "somestring" });
        return url;
    }
}
MVC控制器

public class MyMvcController : Controller
{
    public ActionResult MyAction(int param1, string param2)
    {
        // ...
    }
}
WebApi控制器生成的url将是
http://myDomain/MyMvc/MyAction?param1=1¶m2=somestring

我没有找到如何传递protocol/url模式,但是在最后,它将只是一个字符串,如果您知道协议应该是什么,您可以对它进行操作

希望这有帮助

编辑:

public class MyWebApiController : ApiController
{
    public string Get()
    {
        var url = this.Url.Link("Default", new { Controller = "MyMvc", Action = "MyAction", param1 = 1, param2 = "somestring" });
        return url;
    }
}
这可能有助于协议部分:

这扩展了VictorBahtev的回答,提到了ASP.NET核心

2020年,您的项目有可能以ASP.NET Core 3.1为目标。在当前版本的WebAPI中,有一种方法可用于执行OP所要求的技巧。下面的方法不需要路由参数(OP未提供该参数):


Default
是什么意思?
Default
是路线的名称。请参见
RouteConfig.cs
如果WebAPI2控制器用RoutePrefix[RoutePrefix(“api/MyContoller”)]修饰,则这似乎不起作用。您将获得后跟控制器名称的基本URL,而不是后跟路由前缀的所需基本URL。i、 e.您得到:HOST/MyContoller/MyAction而不是HOST/api/MyContoller/MyAction(其中api/MyContoller是我的路由前缀,正好包含我的控制器名称),如果该操作具有路由修饰,您可能会怀疑类似的问题。我需要在同一个控制器上获取操作的URL,并且正在使用RoutePrefix和路由修饰器。我发现调用Url.Content(“MyRoute/”)时;(其中“MyRoute”是在同一控制器中装饰不同操作的路由的名称)运行良好。它给了我{HOST}/{ROUTE-PREFIX}/{ROUTE},而不是{HOST}/{CONTROLLER}/{ACTION}(这永远不会解决)