同时阅读FromUri和FromBody

我在web api中有一个新方法

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

请求类就像

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

我正在使用PostBody对localhost / Pusher / PushMessage进行查询?x = foo&y = bar:

 { Message: "foobar" , TestingMode:true } 

我错过了什么吗?

post正文通常是这样的URI字符串:

 Message=foobar&TestingMode=true 

您必须确保HTTP标头包含

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

编辑 :因为它仍然无法正常工作,我自己创建了一个完整的例子。
它打印正确的数据。
我还使用了.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)); } } 

Web API使用命名规则。 post的方法应该用Post开始。

您应该将PushMessage重命名为方法名称PostMessage。

web api默认也会监听(取决于你的路线)’api / values / Message’而不是Pusher / Pushmessage。

[HttpPost]属性不是必需的

您可以使用以下代码在请求正文中发布json:

 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;