我遇到了这个以前有效的代码。
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()而不是修复此问题。研究这个。
答案 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
:
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"