Laden...

Wie kann ich im ASP.NET eigene Urls für bestimmte Aktionen festlegen?

Erstellt von BierDav vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.045 Views
BierDav Themenstarter:in
38 Beiträge seit 2019
vor 4 Jahren
Wie kann ich im ASP.NET eigene Urls für bestimmte Aktionen festlegen?

Hallo,

ich möchte gerne in meiner ASP.Net Webanwendung (habe Leer ausgewählt) für jede Methode einen eigen Url definieren. Ich hab mich schon informiert aber alle arbeiten mit MVC und jetzt wüsste ich gern wie das auch normal geht. Bzw. Mein Ziel ist das wenn ich "http://.../Api/<Methodenname>" aufrufe ich nur die eine Methode ansprechen könnte.

Das wäre in meiner Startupdatei die ConfigureMetode wo bei ich statt <Methode> den Namen meiner Methode eingesetzt habe.


public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseMvc(routes =>
            {                
                routes.MapRoute("default", "{Controller}/GetUser", new { controller = "Api", action = "<Methode>" });
            });

            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("MVC didn't find anything!");
            });
}

Und in meiner ApiController Klasse:


[Route("[controller]")]
public class ApiController : ControllerBase
{
        [HttpGet]
        [Produces("application/json")]
        [ActionName("<Methodenname>")]
        [Route("[Controller]/<Methodenname>")]
        public IActionResult <Methodenname>([FromBody]Value value)
        {
            //...
        }
}

Ich hoffe das ich mein Problem verständlich vormuliert habe.
Und bedanke mich schon im voraus für eine Anwort. 😃

LG BierDav

Trifft eine Programmiererin ihre Freundin und die Freundin fragt: "Mit welchen Typen hängst du so in letzter Zeit rum?" Die Programmiererin antwortet: „integers, booleans und strings“

2.207 Beiträge seit 2011
vor 4 Jahren

Hallo BierDav,

willst du eine WebAPI machen? So wie hier? Tutorial: Create a web API with ASP.NET Core MVC

Gruss

Coffeebean

BierDav Themenstarter:in
38 Beiträge seit 2019
vor 4 Jahren

Ja genau!
Nur (anhand des Bespiels) möchte ich dann api/PostTodo aufrufen und nicht api/Todo/...

LG BierDav

Trifft eine Programmiererin ihre Freundin und die Freundin fragt: "Mit welchen Typen hängst du so in letzter Zeit rum?" Die Programmiererin antwortet: „integers, booleans und strings“

16.806 Beiträge seit 2008
vor 4 Jahren

/posttodo ist aber falsch, wenn Du korrekt REST machen willst.

Siehe Regeln zu REST.

Aber wie man die URLs definiert, das steht auch in der Doku.
Keine Lust diese zu lesen?

BierDav Themenstarter:in
38 Beiträge seit 2019
vor 4 Jahren

Dort steht wie man URLs definiert aber nicht wie man sie für eine bestimmte Action vergiebt. Und du hast Recht ich hab mich vertan ich Meinte api/todo/PostTodo (Mein Fehler)

LG BierDav

Trifft eine Programmiererin ihre Freundin und die Freundin fragt: "Mit welchen Typen hängst du so in letzter Zeit rum?" Die Programmiererin antwortet: „integers, booleans und strings“

2.207 Beiträge seit 2011
vor 4 Jahren

Hallo BierDav,

"PostTodo" ist hier nicht richtig. Schau dir REST an. POST ist ein Verb. Man schickt einen POST Request an "/api/todo". Daraus ergibt sich ja, was man tun will.

Wie man die URLs vergibt steht ebenfalls in der Doku. Wie gesagt, ich glaube dir sind die Verben, die mit [HttpPost] etc angegeben werden, nicht klar.

Schau dir REST an, ich denke dann wird es klarer.

Ich vermute gerade, dass du im StartUp.cs schon Routen mappen willst. Das brauchst du nicht, das machst du bei einer WebAPI für die APIController im Controller selber.

Gruss

Coffeebean

BierDav Themenstarter:in
38 Beiträge seit 2019
vor 4 Jahren

Ich habe es gelesen aber mein Problem ist das ich in einem Controller mehrere Get und Post Metoden habe und diesen einen eigenen Url wegen der verwechslungs Gefahr deklarieren möchte

Trifft eine Programmiererin ihre Freundin und die Freundin fragt: "Mit welchen Typen hängst du so in letzter Zeit rum?" Die Programmiererin antwortet: „integers, booleans und strings“

2.207 Beiträge seit 2011
vor 4 Jahren

Hallo BierDav,

Ahhh, daher weht der Wind 😃

Hast du Beispiele? Was hast du konkret vor? Wozu brauchst du verschiedene GETs oder POSTs in einem Controller?

Gruss

Coffeebean

BierDav Themenstarter:in
38 Beiträge seit 2019
vor 4 Jahren

Ja.
Ich habe in meinem Projekt eine Benutzer Verwaltung und da habe ich get-methoden wo ich die Details oder nur die User ID oder Username zurück gebe. Aber z.b. bei Details und User ID habe ich die selbe **[frombody] ** Klasse und dies möchte ich auch beibehalten.

LG BierDav

Trifft eine Programmiererin ihre Freundin und die Freundin fragt: "Mit welchen Typen hängst du so in letzter Zeit rum?" Die Programmiererin antwortet: „integers, booleans und strings“

2.207 Beiträge seit 2011
vor 4 Jahren

Hallo BierDav,

[FromBody] serialisiert deinen Request-Body bei einem entsprechendem Request. Du kannst die Klasse durchaus beibehalten und wiederverwenden.

Wenn du an einen Controller etwas POSTest, trägst du etwas neues ein. Da du noch nichts konkretes gezeigt hast, eventuell einen User.

Was die GET Request mit dem [FromBody] zu tun haben ist mir noch nicht klar. Kannst du konkreter werden? Hast du Code?

Gruss

Coffeebean

BierDav Themenstarter:in
38 Beiträge seit 2019
vor 4 Jahren

Den Code möchte ich nicht preisgeben aber ich habe eine Objekt Klasse (in dem Beispiel unten** User**)in der habe ich Username und Passwort und bei beiden Methoden steht sowas:


[HttpGet]
public IActionResult <Metodenname>([FromBody]User user)

Hierbei gibt es keine eindeutige Möglichkeit zwei dieser Methoden (außer dem namen) auseinander zu kennen.

LG BierDav

Trifft eine Programmiererin ihre Freundin und die Freundin fragt: "Mit welchen Typen hängst du so in letzter Zeit rum?" Die Programmiererin antwortet: „integers, booleans und strings“

2.207 Beiträge seit 2011
vor 4 Jahren

Hallo BierDav,

wieso nicht? Du kannst das Routing Attribut auch auf die Methode hängen.


// GET: api/todo
[HttpGet]
public async Task<ActionResult<TodoItem[]>> GetTodoItems()
{
    // ...
}

// GET: api/Todo/getwhateveritems
[HttpGet]
[Route("getwhateveritems")]
public async Task<ActionResult<TodoItem>> MySuperMethodName()
{
    // ...
}

oder alternativ


// GET: api/Todo/getwhateveritems
[HttpGet("getwhateveritems")]
public async Task<ActionResult<TodoItem>> MySuperMethodName()
{
    // ...
}

Link https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.2#attribute-routing-with-httpverb-attributes

Beachte, dass die Routen der Klasse (des Controllers) und der Methode konkateniert werden.

Aber bitte schau dir REST an!

Ist es das, was du suchst?

Gruss

Coffeebean

16.806 Beiträge seit 2008
vor 4 Jahren

Dein URL Konzept stimmt nicht, weil Du nicht ganz verstehst, wie HTTP funktioniert.Bitte schau Schau Dir nochmal an, was GET und was POST ist - und wozu die beiden Methoden da sind (gibt noch mehr).

Inhalte über den Body werden via POST übertragen - nicht via GET.

Das gesamte Tooling und Schnittstellen von Webtechnologien basieren auf diesem Standard.
Du kannst den Standard auch vollkommen untergaben - aber dann wirds scheisse.

Korrigier Dein URL Konzept.

BierDav Themenstarter:in
38 Beiträge seit 2019
vor 4 Jahren

Auch wenn ich einen HttpPost empfange würde hätte ich zwei Methoden die sich nur mit dem Mentodennamen unterscheiden. Zur Info es ist ein Art JsonRPC

LG BierDav

Trifft eine Programmiererin ihre Freundin und die Freundin fragt: "Mit welchen Typen hängst du so in letzter Zeit rum?" Die Programmiererin antwortet: „integers, booleans und strings“

16.806 Beiträge seit 2008
vor 4 Jahren

Die Methodennamen haben nichts mit der URL zutun, solange Du korrekte URL-Segmente via Route Attribute definierst.
Du kannst daher jeden Methodennamen nehmen, den Du willst.

Prinzipiell missbrauchst Du aber eine REST Middleware. ASP.NET Core Routing versteht per default kein JsonRPC.
Aber es gibt extra Middleware Projekte für Json RPC Routing.

BierDav Themenstarter:in
38 Beiträge seit 2019
vor 4 Jahren

Das der URL mit dem Methodennamen nichts zu tun hat weiß ich ja. Aber ich will so zu sagen einen eigenen Route für die Methode erstellen. Und das will ich ja wissen. 😃

LG BierDav

Trifft eine Programmiererin ihre Freundin und die Freundin fragt: "Mit welchen Typen hängst du so in letzter Zeit rum?" Die Programmiererin antwortet: „integers, booleans und strings“

16.806 Beiträge seit 2008
vor 4 Jahren

Wurde jetzt mehrfach gesagt (und gezeigt): Route Attribute.

BierDav Themenstarter:in
38 Beiträge seit 2019
vor 4 Jahren

Ahhh. Tschuldigung das ichs nicht Kapiert habe. aber was muss ich da jetzt genau reischreiben:
[RouteAttribute(???)]

LG BierDav

Trifft eine Programmiererin ihre Freundin und die Freundin fragt: "Mit welchen Typen hängst du so in letzter Zeit rum?" Die Programmiererin antwortet: „integers, booleans und strings“

2.207 Beiträge seit 2011
vor 4 Jahren

Hallo BierDav,

siehe mein Beispiel oben inklusiver der bereits verlinkten Dokus. Bitte lies dies Doku und die Beiträge hier. Danke.

Gruss

Coffeebean

BierDav Themenstarter:in
38 Beiträge seit 2019
vor 4 Jahren

Vielen Dank. Hab's getscheckt.

LG BierDav

Trifft eine Programmiererin ihre Freundin und die Freundin fragt: "Mit welchen Typen hängst du so in letzter Zeit rum?" Die Programmiererin antwortet: „integers, booleans und strings“