看了园子里关于HttpClient+WebApi的一篇文章,自己试着写了一个,代码几乎一样,但是却无法获得参数
var requestJson = JsonConvert.SerializeObject(new { startId=2,itemcount=3}); var httpContent = new StringContent(requestJson); httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var httpClient = new HttpClient(); var responseJson = httpClient.PostAsync("http://localhost:1702/api/values/sitelist", httpContent) .Result.Content.ReadAsStringAsync().Result; Response.Write(responseJson); Response.End();
public class ValuesController : ApiController { public IList<MyContent> SiteList(int startId,int itemcount) { List<MyContent> list = new List<MyContent>(); list.Add(new MyContent() { Id=1, Name="塞克蓝海", Tag="aa"}); list.Add(new MyContent() { Id = 2, Name = "塞克绿海", Tag = "bb" }); list.Add(new MyContent() { Id = 3, Name = "塞克红海", Tag = "cc" }); list.Add(new MyContent() { Id = 4, Name = "塞克黄海", Tag = "dd" }); list.Add(new MyContent() { Id = 5, Name = "塞克青海", Tag = "ee" }); var result = (from MyContent mc in list where mc.Id > startId select mc) .Take(itemcount) .ToList(); return result; } }
出现这个错误提示
"The parameters dictionary contains a null entry for parameter 'startId' of
non-nullable type 'System.Int32' for method
'System.Collections.Generic.IList`1[QM.API.Models.MyContent] SiteList(Int32,
Int32)' in 'QM.API.Controllers.ValuesController'. An optional parameter must be
a reference type, a nullable type, or be declared as an optional parameter."
而如果把请求路径写成http://localhost:1702/api/values/sitelist?startId=2&itemcount=3这样的话,就可以正常获取数据。
怀疑服务端没有解析到参数的问题,于是把SiteList(int startId,int itemcount)参数写成SiteList(object pp),断点可以请求大SiteList且pp={"startId":2,"itemcount":3},请求帮助是什么原因导致的。
可能问题与Visual Studio内置的Web服务器有关,你用IIS试试
@Sicket: 那你把例子中的客户端代码复制过来试试
@dudu: 也不行,只有在原项目上运行才正常,复制到自己的项目就没办法获取到参数,很困惑,试了IIS一样有问题,不知道是什么原因
@Sicket: 可能是ASP.NET WebAPI版本的问题,你在原项目中用NuGet将WebAPI更新至最新版本试试。
@Sicket: 这个问题的原因已经找到,我写了一篇博客: