mvc frombody c# asp.net asp.net-web-api http-post frombodyattribute

c# - mvc - Lectura FromUri y FromBody al mismo tiempo



frombody c# (3)

Tengo un nuevo método en la API web

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

donde la clase de solicitud es como

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

Estoy haciendo una consulta a localhost / Pusher / PushMessage? X = foo & y = bar con PostBody:

{ Message: "foobar" , TestingMode:true }

¿Me estoy perdiendo de algo?


La API web usa reglas de nombres. El método para una publicación debe iniciarse con Post.

Debe cambiar el nombre de su PushMessage al nombre de método PostMessage.

Además, la API web escucha de manera predeterminada (según su ruta) a ''api / values ​​/ Message'' y no a Pusher / Pushmessage.

El atributo [HttpPost] no es obligatorio


Puede usar el siguiente código para publicar json en el cuerpo de la solicitud:

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;


Un cuerpo de publicación suele ser una cadena de URI como esta:

Message=foobar&TestingMode=true

Debe asegurarse de que el encabezado HTTP contenga

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

EDITAR : Debido a que todavía no está funcionando, yo mismo creé un ejemplo completo.
Imprime los datos correctos.
También utilicé .NET 4.5 RC.

// 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)); } }