繁体   English   中英

C#Http Post问题

[英]C# Http Post issue

我在以前曾经工作过的这段代码上遇到了麻烦。

    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
}

摘要:

本来是行不通的,因为即使有更好的Tasks和async代码,它也不会超出发布请求。

我对C#中的Async或Tasks一无所知,只有Java。 在将代码修复为建议的修复程序并专注于任务之后,实际的问题出在授权标头上。 谁知道为什么这对我来说是一个更好的答案。 改用Add()可以解决此问题。 将对此进行研究。

PushTest()Task<T>因此您不需要从返回的T创建一个新Task (等待有意义吗?)。

尝试做

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

假设您实际上需要PostResponse,因为您的代码中没有实际使用它(提示:也许尝试返回一些东西 )。

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

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

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

这是假设keyfoo的结果HTTP请求:

GET http://example.com/ HTTP/1.1
Authorization: Access-Token foo

但是,基于修复代码示例的更新,而改用了.Add() ,似乎正在调用的Web api使用名为Access-Token的自定义HTTP标头,而不是标准的Authorization标头。 因此,当您这样做时:

client.DefaultRequestHeaders.Add( "Access-Token" , key );

它生成一个HTTP标头,称为Access-Token ,其值为key 再次假设key="foo" ,这将生成以下HTTP请求:

GET http://example.com/ HTTP/1.1
Access-Token: foo

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM