我想调用Api函数(1st)。来自使用 HttpClient 的第二个Api功能。但我总是得到 404 错误。
第一个Api功能(终点: 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()
);
OR
return client.PutAsJsonAsync(uri, filecontent)
.ContinueWith
(
task => task.Result.EnsureSuccessStatusCode()
);
答案 0 :(得分:8)
你可能已经发现,不,你不能。当您调用PostAsJsonAsync
时,代码会将参数转换为JSON并将其发送到请求正文中。您的参数是一个JSON数组,它看起来像下面的数组:
[1,"/","?aid",345,"&content=","aGVsbG8gd29ybGQ="]
这不是第一个功能所期望的(至少这是我想象的,因为你没有显示路线信息)。这里有几个问题:
byte[]
(引用类型)的参数将在请求的正文中传递,而不是在URI中传递(除非您使用{{1显式标记参数)属性)。代码看起来像这样:
[FromUri]
现在,上面的代码存在另一个潜在问题。它正在等待网络响应(当您访问var uri = "api/Test/" + id + "/?aid=" + aid;
using (HttpResponseMessage response = client.PutAsJsonAsync(uri, filecontent).Result)
{
return response.EnsureSuccessStatusCode();
}
返回的.Result
中的Task<HttpResponseMessage>
属性时会发生什么。根据环境的不同,可能发生的更糟糕的是它可能会死锁(等待网络响应将到达的线程)。在最好的情况下,该线程将在网络调用期间被阻塞,这也是不好的。考虑使用异步模式(等待结果,返回{{ 1}}在你的行动中),就像在下面的例子中一样
PostAsJsonAsync
或没有async / await关键字:
Task<T>