it-swarm.com.de

aufruf an Web-API mit String-Parameter

Ich habe eine Web-API, bei der ich zwei Methoden habe, eine ohne Parameter und zwei mit unterschiedlichen Parametertypen (string und int). Beim Aufruf der String-Methode funktioniert es nicht ... Was fehlt mir hier?

public class MyControllerController : ApiController
{
    public IHttpActionResult GetInt(int id)
    {
        return Ok(1);
    }

    public IHttpActionResult GetString(string test)
    {
        return Ok("it worked");
    }
}

WebApiConfig.cs:

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

Mein Anruf:

/ api/MyController/MyString // Funktioniert nicht

/ api/MyController/1 // funktionieren

Ich erhalte folgende Fehlermeldung:

Das Parameterwörterbuch enthält einen Null-Eintrag für den Parameter 'id' des nicht nullfähigen Typs 'System.Int32' für die Methode 'System.Web.Http.IHttpActionResult GetInt (Int32)' in 'TestAngular.Controllers.MyControllerController'. Ein optionaler Parameter muss ein Referenztyp oder ein mit Nullwert verwendbarer Typ sein oder als optionaler Parameter deklariert sein.

Was fehlt mir in meiner Anfrage?

9
MrProgram

Sie müssen Ihre Uris ändern

/api/MyController

/api/MyController/string 

/api/MyController/1 

Sie müssen die Methoden nicht angeben.

Sie können sich dieses Tutorial auf asp.net zur weiteren Erläuterung ansehen.

7
Christos

Auch diese Uris sollten funktionieren:

api/MyController/GetAll
api/MyController/GetString?param=string
api/MyController/GetInt?param=1

Ich denke, das ist viel klarer und sollte immer funktionieren. Sie verwenden das Routing-Verhalten.

Siehe hier: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-und-aktion-auswahl

6
PinBack

Hier ist meine Lösung: Ohne Änderung der Standardroute in der Datei webapiconfig.cs 

fügen Sie Ihrer String-Funktion nur eine Route hinzu:

[Route("Api/MyController/GetString/{test}")]
public IHttpActionResult GetString(string test)

http: // localhost: 49609/api/MyController/GetString/stringtest

5
sa_

Es ist schon eine Weile her, seit Sie dies veröffentlicht haben, aber ich glaube, ich habe die Antwort ... Zunächst einmal gibt es zwei Probleme. Erstens können Sie, wie Pinback feststellte, nicht dieselbe Route für zwei verschiedene Endpunkte verwenden.

Wenn Sie jedoch nur die int-Methode entfernen, stoßen Sie immer noch auf das Problem . Denken Sie daran: Die Standardroute sieht folgendermaßen aus: api/{controller}/{id} .__ muss "id" heißen und nicht "test".

Ändern Sie die Signatur wie folgt:

public IHttpActionResult GetString(string id)

und es wird funktionieren. (Sie können auch {id} in {test} in der Datei webapiconfig.cs ändern).

3
kensuprime

Sie können String-Parameter auch in body übernehmen

string body;
using (var sr = new StreamReader(Request.Body))
body = sr.ReadToEnd();
0
codeInDream