Reading FromUri and FromBody at the same time Reading FromUri and FromBody at the same time asp.net asp.net

Reading FromUri and FromBody at the same time


A post body is typically a URI string like this:

Message=foobar&TestingMode=true

You have to make sure that the HTTP header contains

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

EDIT: Because it's still not working, I created a full example myself.
It prints the correct data.
I also used .NET 4.5 RC.

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


The Web API uses naming regulations. The method for a post should be started with Post.

You should rename your PushMessage to method name PostMessage.

Also the web api defaulty listens (depending on your route) to 'api/values/Message' and not to Pusher/Pushmessage.

[HttpPost] attribute is not required


You may use following code to post json in request body:

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;