6

我想调用 Api 函数 (1st) 。从使用HttpClient的第二个 Api 函数。但我总是收到404错误。

第一个 API 函数端点: http://本地主机: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()
            );
4

1 回答 1

8

正如您可能发现的那样,不,您不能。当您调用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();
}

现在,上面的代码还有另一个潜在问题。它正在等待网络响应(这就是当您访问.Result由.最好的情况是这个线程将在网络调用期间被阻塞,这也很糟糕。考虑使用异步模式(等待结果,在您的操作中返回 a),如下例所示Task<HttpResponseMessage>PostAsJsonAsyncTask<T>

public async Task<HttpResponseMessage> Put(int id, int aid, 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, int aid, byte[] filecontent)
{
    // ...

    var uri = "api/Test/" + id + "/?aid=" + aid;
    return client.PutAsJsonAsync(uri, filecontent).ContinueWith<HttpResponseMessage>(
        task => task.Result.EnsureSuccessStatusCode());
}
于 2013-04-09T20:31:56.347 回答