如何使用HttpClient从Web Api调用PUT方法?

时间:2013-04-09 19:19:30

标签: c#-4.0 rest asp.net-mvc-4 asp.net-web-api dotnet-httpclient

我想调用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()
            );

1 个答案:

答案 0 :(得分:8)

你可能已经发现,不,你不能。当您调用PostAsJsonAsync时,代码会将参数转换为JSON并将其发送到请求正文中。您的参数是一个JSON数组,它看起来像下面的数组:

[1,"/","?aid",345,"&content=","aGVsbG8gd29ybGQ="]

这不是第一个功能所期望的(至少这是我想象的,因为你没有显示路线信息)。这里有几个问题:

  • 默认情况下,类型byte[](引用类型)的参数将在请求的正文中传递,而不是在URI中传递(除非您使用{{1显式标记参数)属性)。
  • 其他参数(同样,基于我对你的路线的猜测)需要成为URI的一部分,而不是身体的一部分。

代码看起来像这样:

[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>