2016-07-29 14 views
0

ich viele Zeit heute versucht, eine Web-API-Funktion mit POST (HttpClient.PostAsync) Methode aufzurufen. Aber leider kann ich nicht. Nur der Anruf mit GET (HttpClient.GetAsync) Methode arbeiten mit Erfolg. Ich versuche, viele Beispiele im Netz zu folgen, aber immer den gleichen Fehler. ("Not Found")WebAPI POST-Methode nicht gefunden, aber GET Werke

Vielen Dank, wenn jemand mir

helfen kann

Hier ist das C# Web API:

[RoutePrefix("NewAreaMap")] 
public class NewAreaMapController: ApiController 
{ 
    [HttpPost] 
    [ActionName("PostCreateAreaTemp")] 
    public AreaTemp PostCreateAreaTemp(double southLatitude, double westLongitude, double northLatitude, double eastLongitude, int countryId, int worldId) 
    { 
     AreaTemp newTempMap = new AreaTemp(); 
     //..... 
     * * Here is the C# code from client side: * * 
      using(var client = new HttpClient()) 
      { 
       client.BaseAddress = new Uri(ConfigurationManager.AppSettings["SrvWebApiPath"].ToString()); 
       client.DefaultRequestHeaders.Accept.Clear(); 
       client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
       var values = new Dictionary < string, 
        string >() 
        { 
         { 
          "southLatitude", southLatitude.ToString() 
         }, 
         { 
          "westLongitude", westLongitude.ToString() 
         }, 
         { 
          "northLatitude", northLatitude.ToString() 
         }, 
         { 
          "eastLongitude", eastLongitude.ToString() 
         }, 
         { 
          "countryId", countryId.ToString() 
         }, 
         { 
          "worldId", worldId.ToString() 
         } 
        }; 
       var content = new FormUrlEncodedContent(values); 
       HttpResponseMessage response = await client.PostAsync("api/NewAreaMap/PostCreateAreaTemp", content) 
       if (response.IsSuccessStatusCode) 
       { 
        string jsonData = response.Content.ReadAsStringAsync().Result; 
        newAreTemp = JsonConvert.DeserializeObject <AreaTemp> (jsonData); 
       } 
     } 

Der Aufruf GET Arbeit gut mit der folgenden URL:

HttpResponseMessage response = await client.GetAsync("api/NewAreaMap/GetAreaTemp/?latitudeAreaCenter=7.02&longitudeAreaCenter=9.05"); 
+1

Haben die Webserver-Logs zeigen nichts interessanter als andere 404? – BugFinder

+0

An welchen URI möchten Sie senden? Bitte geben Sie auch die GET-URI an. –

+0

Ich füge in der Beschreibung hinzu –

Antwort

1

Da Sie einen JSON veröffentlichen, können Sie ihn auch als Objekt senden. Oder wenn Sie immer noch das Wörterbuch und die Signatur für das Verfahren behalten möchten Sie könnten versuchen:

var content = new StringContent(JsonConvert.SerializeObject(values), 
      Encoding.UTF8, "application/json"); 

Statt

var content = new FormUrlEncodedContent(values); 

Hier ist ein Beispiel mit einem Objekt.

public class SampleObject 
{ 
    public double SouthLatitude { get; set; } 
    public double WestLongitude { get; set; } 
    public double NorthLatitude { get; set; } 
    public double EastLongitude { get; set; } 
    public int CountryId { get; set; } 
    public int WorldId { get; set; } 
} 

Und ändern Sie Ihre Anfrage.

using (var client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri(ConfigurationManager.AppSettings["SrvWebApiPath"].ToString()); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    var obj = new SampleObject 
    { 
     SouthLatitude = southLatitude, 
     WestLongitude = westLongitude, 
     NorthLatitude = northLatitude, 
     EastLongitude = eastLongitude, 
     CountryId = countryId, 
     WorldId = worldId 
    }; 

    // Send it as StringContent. 
    var request = new StringContent(JsonConvert.SerializeObject(obj), 
     Encoding.UTF8, "application/json"); 

    HttpResponseMessage response = await client.PostAsync("api/NewAreaMap/PostCreateAreaTemp", request) 
    if (response.IsSuccessStatusCode) 
    { 
     string jsonData = response.Content.ReadAsStringAsync().Result; 
     newAreTemp = JsonConvert.DeserializeObject<AreaTemp>(jsonData); 
    } 
} 

Und die Signatur auf dem Server.

public AreaTemp PostCreateAreaTemp(SampleObject sampleObject) 

Oder bei Bedarf:

public AreaTemp PostCreateAreaTemp([FromBody]SampleObject sampleObject) 
+0

Danke, jetzt geht alles gut. Vielen Dank, du nimmst viele Male für mich und schreibst eine schöne Antwort als Beispielcode. –

+0

Aus Neugier; Brauchst du '[FromBody]'? Ich lerne nie, wenn es nötig ist oder nicht ... – smoksnes

+0

@smoksnes stimmt, das gleiche hier, weil es funktioniert, ohne es zu benutzen. Ich sah Mann Zeit Entwickler wie ich es benutzen oder irgendwann nicht, scheint es nur Attribut von Microsoft für die sichere Seite bieten. –

0

Bitte versuchen FromBody Attribut mit dem Aktionsparameter zu verwenden.

+0

Können wir frombody Attribut mit keiner der Parameter verwenden? –

1

Ihre Methodenparameter mit dem Objekt ersetzen, weil Sie die volle Objekt vorbei „Inhalt“ aus dem Httpclient so in diesem Fall, dass Sie gleiches Objekt auch hier verwenden müssen mit [frombody] Methodennamen Attribut ([FromBody] Inhalt Inhalt) Definieren Sie alle Eigenschaften in einer Klasse und verwenden Sie sie. Hoffe, es wird für Sie hilfreich sein.

+0

Danke, ich gebe dir einen Punkt, wie @smoksnes sagte. Ist ein Teil der Antwort –

+1

@ MehdiBugnard danke, habe ich vorher geschrieben, aber ich respektiere smoksnes antworten er schrieb Antwort mit Code. –

Verwandte Themen