Lectura FromUri y FromBody al mismo tiempo

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?

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

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().Result;