2012-08-22 1 views
24

ich eine neue Methode in Web-api habenLese FromUri und FromBody zugleich

[HttpPost] 
public ApiResponse PushMessage([FromUri] string x, [FromUri] string y, [FromBody] Request Request) 

wo Anfrage Klasse ist wie

public class Request 
{ 
    public string Message { get; set; } 
    public bool TestingMode { get; set; } 
} 

ich eine Abfrage machen localhost/Pusher/PushMessage ? x = foo & y = bar mit PostBody:

{ Message: "foobar" , TestingMode:true } 

bin ich etwas fehlt?

Antwort

26

Ein Post Körper ist in der Regel eine URI-Zeichenfolge wie folgt aus:

Message=foobar&TestingMode=true 

Sie müssen sicherstellen, dass der HTTP-Header enthält

Content-Type: application/x-www-form-urlencoded 

EDIT: Weil es immer noch nicht funktioniert, ich Ich habe selbst ein vollständiges Beispiel erstellt.
Es druckt die richtigen Daten.
Ich habe auch .NET 4.5 RC verwendet.

// server-side 
public class ValuesController : ApiController { 
    [HttpPost] 
    public string PushMessage([FromUri] string x, [FromUri] string y, [FromBody] Person p) { 
     return p.ToString(); 
    } 
} 

public class Person { 
    public string Name { get; set; } 
    public int Age { get; set; } 

    public override string ToString() { 
     return this.Name + ": " + this.Age; 
    } 
} 

// client-side 
public class Program { 
    private static readonly string URL = "http://localhost:6299/api/values/PushMessage?x=asd&y=qwe"; 

    public static void Main(string[] args) { 
     NameValueCollection data = new NameValueCollection(); 
     data.Add("Name", "Johannes"); 
     data.Add("Age", "24"); 

     WebClient client = new WebClient(); 
     client.UploadValuesCompleted += UploadValuesCompleted; 
     client.Headers["Content-Type"] = "application/x-www-form-urlencoded"; 
     Task t = client.UploadValuesTaskAsync(new Uri(URL), "POST", data); 
     t.Wait(); 
    } 

    private static void UploadValuesCompleted(object sender, UploadValuesCompletedEventArgs e) { 
     Console.WriteLine(Encoding.ASCII.GetString(e.Result)); 
    } 
} 
+1

Es ist wahr, nur wenn ich mvc Struktur verwenden. Dies ist jedoch Web-API, also ist die Bindung anders als mvc. Aber danke für deine Antwort! – kkocabiyik

+0

Stellen Sie sicher, dass der HTTP-Header 'Content-Type: application/x-www-form-urlencoded' enthält. –

+0

Sie können nicht wie reiner Text zu Web-API mvc: S – kkocabiyik

0

können Sie folgenden Code verwenden json in Anforderungstext zu schreiben:

var httpClient = new HttpClient(); 
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

Request request = new Request(); 
HttpResponseMessage response = httpClient.PostAsJsonAsync("http://localhost/Pusher/PushMessage?x=foo&y=bar", request).Result; 

//check if (response.IsSuccessStatusCode) 
var createResult = response.Content.ReadAsAsync<YourResultObject>().Result; 
1

Die Web API Namensgebung Vorschriften verwendet. Die Methode für einen Post sollte mit Post gestartet werden.

Sie sollten Ihre PushMessage in Methodenname PostMessage umbenennen.

Auch der Web-API-Standard hört (abhängig von Ihrer Route) zu "api/values ​​/ Message" und nicht zu Pusher/Pushmessage.

[Httppost] Attribut ist nicht erforderlich

+0

Die Methode für einen Beitrag sollte mit Post gestartet werden. : Nicht erforderlich –

+0

Diese Antwort ist falsch. Die Methode benötigt 'Post' nur im Namen, wenn kein [HttpPost] -Attribut vorhanden ist. – ehsan88