使用PostAsync

时间:2016-11-27 17:56:26

标签: c# dotnet-httpclient

我使用以下方法发布到Web服务。当我使用它时,我经常遇到400错误。如果我使用通过Posty传入的相同数据,则服务返回预期数据

public static async Task<T> SendData<T>(string apiToUse, params string[] data)
    {
        var url = string.Format("{0}/{1}", Constants.BaseTestUrl, apiToUse);

        dynamic t;

        var kvp = new Dictionary<string, string>();

        for (var i = 0; i < data.Length; i += 2)
        {
            kvp.Add(data[i], data[i + 1]);
        }

        var dta = new FormUrlEncodedContent(kvp);
        dta.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data");

        using (var client = new HttpClient())
        {
            var result = client.PostAsync(url, dta).Result;
            //result.Content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data");
            var rv = result.Content.ReadAsStringAsync().Result;
            t = JsonConvert.DeserializeObject<T>(rv);
        }

        return t;
    }

在我的测试示例中,我将两个键和两个值传递给param string []数据。

我能看到的唯一不同的是,在我点击发送之前我已经定义了Content-Type(我在这里也做了)。

这让我有些疯狂,所以任何指针都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

如果不完全知道请求应该是什么样子,很难提供完整的答案。您可以按如下方式尝试/调整代码:

 var kvp = string.Empty;

 for (var i = 0; i < data.Length; i += 2)
 {
     kvp += string.Format("{0}={1}; ", data[i], data[i+1]);
 }

 // remove last ';' character
 kvp = kvp.TrimEnd(new char[] { ' ', ';' });

 var dta = new MultipartFormDataContent();
 dta.Add(new StringContent(kvp));

更改包括使用MultipartFormDataContent符合请求格式。显然,这段代码仅用于测试。在将其投入生产之前,应该进行额外的验证和内容创建(kvp)。