我想调用Api函数(1st).来自使用HttpClient的第二个Api功能.但我总是得到404错误.
第一个Api函数(EndPoint:http:// localhost:xxxxx / api / Test /)
public HttpResponseMessage Put(int id,int accountId,byte[] content) [...]
第二个Api功能
public HttpResponseMessage Put(int id,int aid,byte[] filecontent) { WebRequestHandler handler = new WebRequestHandler() { AllowAutoRedirect = false,UseProxy = false }; using (HttpClient client = new HttpClient(handler)) { client.BaseAddress = new Uri("http://localhost:xxxxx/"); // Add an Accept header for JSON format. client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var param = new object[6]; param[0] = id; param[1] = "/"; param[2] = "?aid="; param[3] = aid; param[4] = "&content="; param[5] = filecontent; using (HttpResponseMessage response = client.PutAsJsonAsync("api/Test/",param).Result) { return response.EnsureSuccessStatusCode(); } } }
所以我的问题是.我能像我一样从HttpClient发布方法参数作为对象数组吗?我不想将模型作为方法参数传递.
我的代码有什么问题?
更改代码后无法获得任何响应
return client.PutAsJsonAsync(uri,filecontent) .ContinueWith<HttpResponseMessage> ( task => task.Result.EnsureSuccessStatusCode() );
要么
return client.PutAsJsonAsync(uri,filecontent) .ContinueWith ( task => task.Result.EnsureSuccessStatusCode() );
解决方法
你可能已经发现了,不,你不能.当您调用PostAsJsonAsync时,代码会将参数转换为JSON并将其发送到请求正文中.您的参数是一个JSON数组,它看起来像下面的数组:
[1,"/","?aid",345,"&content=","aGVsbG8gd29ybGQ="]
这不是第一个功能所期望的(至少这是我想象的,因为你还没有显示路线信息).这里有几个问题:
>默认情况下,byte []类型的参数(引用类型)在请求正文中传递,而不是在URI中传递(除非您使用[FromUri]属性显式标记参数).
>其他参数(再次,基于我对你的路线的猜测)需要成为URI的一部分,而不是身体.
代码看起来像这样:
var uri = "api/Test/" + id + "/?aid=" + aid; using (HttpResponseMessage response = client.PutAsJsonAsync(uri,filecontent).Result) { return response.EnsureSuccessStatusCode(); }
现在,上面的代码还有另一个潜在的问题.它正在等待网络响应(当你访问PostAsJsonAsync返回的Task< HttpResponseMessage>中的.Result属性时会发生什么.根据环境,可能发生的更糟糕的是它可能会死锁(等待一个线程,其中网络响应将到达).在最好的情况下,这个线程将在网络呼叫期间被阻塞,这也是不好的.考虑使用异步模式(等待结果,在你的行动中返回任务< T>),比如下面的例子
public async Task<HttpResponseMessage> Put(int id,byte[] filecontent) { // ... var uri = "api/Test/" + id + "/?aid=" + aid; HttpResponseMessage response = await client.PutAsJsonAsync(uri,filecontent); return response.EnsureSuccessStatusCode(); }
或者没有async / await关键字:
public Task<HttpResponseMessage> Put(int id,byte[] filecontent) { // ... var uri = "api/Test/" + id + "/?aid=" + aid; return client.PutAsJsonAsync(uri,filecontent).ContinueWith<HttpResponseMessage>( task => task.Result.EnsureSuccessStatusCode()); }