Wie erstelle ich eine ASP.NET-Web-API-URL?

120

In ASP.NET MVC haben wir @Url.Actionfür Aktionen. Gibt es etwas Ähnliches, @Url.Apidas an / api / controller weiterleiten würde?

Shane Courtrille
quelle

Antworten:

139

Der ApiController verfügt über eine Eigenschaft namens Url vom Typ System.Web.Http.Routing.UrlHelper , mit der Sie URLs für API-Controller erstellen können.

Beispiel:

public class ValuesController : ApiController
{
    // GET /api/values
    public IEnumerable<string> Get()
    {
        // returns /api/values/123
        string url = Url.Route("DefaultApi", new { controller = "values", id = "123" });
        return new string[] { "value1", "value2" };
    }

    // GET /api/values/5
    public string Get(int id)
    {
        return "value";
    }

    ...
}

Dieser UrlHelper existiert weder in Ihren Ansichten noch in den Standard-Controllern.


AKTUALISIEREN:

Und um Routing außerhalb eines ApiControllers durchzuführen, können Sie Folgendes tun:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        string url = Url.RouteUrl(
            "DefaultApi", 
            new { httproute = "", controller = "values", id = "123" }
        );
        return View();
    }
}

oder in einer Ansicht:

<script type="text/javascript">
    var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
    $.ajax({
       url: url,
       type: 'GET',
       success: function(result) {
           // ...
       }
    });
</script>

Beachten Sie das httproute = ""wichtige Routentoken.

Dies setzt natürlich voraus, dass Ihre API-Route DefaultApiin Ihrer RegisterRoutes-Methode aufgerufen wird in Global.asax:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
Darin Dimitrov
quelle
Das hilft mir wirklich nicht viel, da ich meine Ansicht brauche, um Urls auf sichere Weise generieren zu können. Wenn es eine Go Live-Lizenz gibt, wie können Sie mit "Go Live" URLs in der Ansicht erstellen?
Shane Courtrille
Noch wichtiger ist, dass dies nicht funktioniert, wenn Sie ASP.Net Development Server verwenden, da der Port ständig geändert wird, sodass Sie die URL in der Ansicht nicht einmal festschreiben können.
Shane Courtrille
@ShaneCourtrille, ich habe meine Antwort aktualisiert, um zu veranschaulichen, wie Sie die Normalen verwenden können System.Web.Mvc.UrlHelper, um API-Routen außerhalb eines HttpControllerContext zu generieren.
Darin Dimitrov
Vielen Dank! Ich habe versucht, RouteUrl zu verwenden, wusste aber nichts über die httproute-Parameteranforderung.
Shane Courtrille
2
Ich verstehe den Zweck der Probe; Ich sage, es wäre ein nützlicheres Beispiel, wenn Sie eine Zeile ViewBag-Code einwerfen würden, weil Sie demonstrieren würden, dass dieser Wert das ist, worauf wir in einem wahrscheinlichen Szenario abzielen und nicht nur einen beliebigen Code ausführen. Auch hier hätte ich keinen Kommentar abgegeben, wenn ich nicht ein paar Minuten damit verbracht hätte, nicht zu erkennen, was ich verpasst habe, bevor ich endlich erkannt habe, dass die jeweilige Codezeile die relevante ist.
Jon Davis
43

Es funktioniert mit der einfacheren Form, Url.Actionsodass Sie keine Routing-Namen referenzieren müssen:

Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })

Möglicherweise möchten Sie eine hinzufügen, area = ""wenn die URL in einem Bereich benötigt wird. (API-Controller befinden sich standardmäßig außerhalb von Bereichen.) Ich verwende MVC 4.

Gábor Imre
quelle
7
Der UrlHelper in der Web- API lautet msdn.microsoft.com/en-us/library/… und verfügt über keine Aktionsmethode.
Yuriy Faktorovich
8
@YuriyFaktorovich Dieser Beitrag impliziert, Url.Actiondass aus einer Ansicht verwendet wird. Urlist vom Typ System.Web.Mvc.UrlHelperund wird keinen WebApiRouten zugeordnet. Deshalb benötigen Sie den zusätzlichen Parameter : new { httproute = "" }.
Jesse
3
Ich habe hinzugefügt, httproute""aber es ist nicht Mapping = /
Maslow
Ich musste den Link mit einem leeren Bereich und null htmlAttributes hinzufügen, @Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null) aber das funktionierte perfekt
Christopher G. Lewis
2
Dies funktioniert aus einer Sicht perfekt. Ich bin mir jedoch nicht sicher, warum der Name der Aktion als Abfragezeichenfolge generiert wird: / api / dashboard? Action = getdata. Ich hatte dies erwartet: / api / dashboard / getdata
umutesen
7

Möchten Sie typsichere Links ohne fest codierte Zeichenfolgen (Controller-Namen) generieren können?

Dafür gibt es ein Nuget! (und es ist von Mark Seeman geschrieben)

https://github.com/ploeh/Hyprlinkr

Funktioniert so:

Routen wie gewohnt:

name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }

Holen Sie sich eine URL:

var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));

Ergebnis:

http://localhost/api/foo/1337
Cristian Diaconescu
quelle
3

Hier ist die KISS-Methode zur Beantwortung der Frage:

Wenn dies der Code ist, den Sie zum Erstellen einer MVC-Controller-URL verwenden würden

@Url.Action("Edit", "MyController")

Um eine URL für die API-Version des Controllers zu erhalten (vorausgesetzt, Sie verwenden denselben Controllernamen), können Sie diese verwenden

@Url.Action("Edit", "api/MyController")

Bei der Url.Action-Methode wird lediglich der Stammpfad der Anwendung mit dem Controllernamen gefolgt vom Aktionsnamen angehängt (es sei denn, es handelt sich um "Index". In diesem Fall wird er nicht angehängt. Wenn das Routenwertobjekt eine ID hat Eigenschaft Der Wert wird auch an die URL angehängt.

James Bunch
quelle
Danke dir! Mir fehlte der api/Name vor meinem Controller.
Daniel Congrove