C#Http Post问题

时间:2016-09-13 23:36:33

标签: c# json

我遇到了这个以前有效的代码。

    public static async Task<Response> PushTest() {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Add( "Access-Token" , key ); //PROBLEM WAS HERE FOR SOME REASON
        //PROBLEM CODE
        //client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Access-Token" , key );
        Uri url = new Uri(BaseUrl + "pushes");
        Dictionary<string,string> data =  new Dictionary<string, string>();
        data.Add( "body" , "TestBody" );
        data.Add( "title" , "TestTitle" );
        data.Add( "type" , "note" );
        data.Add( "email" , Email );
        HttpContent jsonContent = new StringContent(JsonConvert.SerializeObject(data, new KeyValuePairConverter()), System.Text.Encoding.UTF8,"application/json");

        HttpResponseMessage post = await client.PostAsync(url, jsonContent); // DEBUG POINT
        // WORKS NOW
        string responseString = await post.Content.ReadAsStringAsync();
        // DOESNT RETURN NULL TO THE MAIN METHOD ANYMORE
        return JsonConvert.DeserializeObject<Response>( responseString );
    }

    private static void Main( string[ ] args ) {
        Task<Response> n = PushTest();
        Response r = n.Result;
        Console.WriteLine( "Done" );
    } // DEBUG POINT
}

摘要:

最初不起作用,因为即使使用更好的Task和async代码,它也不会超过post请求。

我对C#中的异步或任务一无所知,只有java。在将代码修复为建议的修复程序并专注于任务之后,实际问题在于授权标题。谁知道为什么那对我来说是一个更好的答案。切换到Add()而不是修复此问题。研究这个。

2 个答案:

答案 0 :(得分:0)

PushTest()Task<T>,因此您无需在返回的Task中创建新的T(等待是否有意义?)。

尝试

Task<PostResponse> n = PushTest();
PostResponse r = n.Result;

假设您确实需要PostResponse,因为您的代码中没有任何地方您实际使用它(提示:可能会尝试返回某些内容)。

答案 1 :(得分:0)

在您第一次尝试设置标头值时,您使用DefaultRequestHeader.Authorization来设置标头值:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Access-Token" , key );

这将生成一个身份验证标头,其方案为Access-Token,值为key作为身份验证令牌。 AuthenticationHeaderValue ctor的第一个参数是方案,而不是HTTP标头名称。

假设key值为foo

,以下是生成的HTTP请求
GET http://example.com/ HTTP/1.1
Authorization: Access-Token foo

但是,根据您修改代码示例的更新,您改为使用.Add(),您正在调用的Web api似乎使用名为Access-Token的自定义HTTP标头而不是标准{ {1}}标题。所以,当你这样做时:

Authorization

它生成一个名为client.DefaultRequestHeaders.Add( "Access-Token" , key ); 的HTTP标头,其值为Access-Token。再次假设key,这将生成以下HTTP请求:

key="foo"