从Api控制器中生成绝对URL以执行操作

时间:2013-07-19 07:55:12

标签: asp.net-mvc

我正在使用asp.net mvc4,我在' controller1'这个动作:

    [HttpGet]
    public async Task<string> Action1()
    {
        try
        {
            HttpClient cl = new HttpClient();
            string uri = "controller2/action2";
            HttpResponseMessage response = await cl.GetAsync(uri);
            response.EnsureSuccessStatusCode();
            return response.ToString();
        }
        catch
        {
            return null;
        }
    }

当我将uri设置为"http://localhost:1733/controller2/action2"时,该动作正常,但从未将uri设置为&#34; controller2 / action2&#34;或&#34; / controller2 / action2&#34;或&#34;〜/ controller2 / action2&#34;。

如何在不对uri进行硬编码的情况下编写此操作?

谢谢。

2 个答案:

答案 0 :(得分:14)

使用:

string uri = Url.Action("Action2", "Controller2", new {}, Request.Url.Scheme);

<强>更新

由于您正在使用API​​控制器并需要为常规控制器生成Url,因此您将不得不使用:

string uri = this.Url.Link("Default", new { controller = "Controller2", action = "Action2" });

其中Default是已注册路由集合中定义的route的名称,或者如果您已为此操作创建了特定路由,请使用其名称并new{}作为第2个参数。

对于MVC版本4,请检查~/App_Start/RoutesConfig.cs处的注册路线。对于MVC版本3,请检查RegisterRoutes中的Global.asax方法。

答案 1 :(得分:12)

另一个也许更简单的答案是在WebApi类中创建UrlHelper的实例:

var url = new UrlHelper(System.Web.HttpContext.Current.Request.RequestContext);
item.Url = url.Action("Doc", "Editor", new {id=1});

传递当前的请求上下文,你就是金子。