【问题标题】:C# Http Post issueC# Http Post 问题
【发布时间】:2016-09-14 09:49:45
【问题描述】:

我在这段代码之前遇到过问题。

    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
}

总结:

最初不会工作,因为它无法通过发布请求,即使使用更好的任务和异步代码。

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

【问题讨论】:

  • 看看async voidasync Task的区别
  • 这根本没有帮助。我已尝试将其转换为异步任务,但仍未发布。
  • 然后做更多的事情,真正看看差异。努力实现我给的提示
  • 你能看一下代码并告诉我为什么它现在不起作用以及为什么它以前起作用吗?如果我知道我写的代码不是垃圾,我可以去看看这之间的所有区别。我已经为此倾倒了 10 个小时。
  • 如果是停得太快,还没做完就结束的问题,肯定会在10秒内完成。如果这是问题所在,那为什么它不起作用。

标签: c# json


【解决方案1】:

PushTest() 是一个Task&lt;T&gt;,因此您不需要从返回的T 中创建一个新的Task(等等,这有意义吗?)。

尝试做

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

假设您确实需要 PostResponse,因为您的代码中没有任何地方实际使用它(提示:也许尝试返回 something)。

【讨论】:

  • 这样效果更好,但这不是真正的问题。如果归结为编码实践,那我就完全错了。但是正如我在开始和 cmets 中所说的那样,我正在尝试逐行调试此代码,并在发布请求后退出。它在完成之前不会关闭。它只是从不做任何事情。
  • 我明白了,当我阅读它时并不清楚...您必须查看请求/响应,并在调试时启用您的异常。尝试Fiddler 看看当你将请求发送到服务器时发生了什么
  • 再次查看开头的问题。这将阐明什么是错误的。我将 cmets 放入以显示它的窃听位置。
  • 我再次推荐使用 Fiddler 之类的东西来查看幕后。您正在窃听的服务器显然不喜欢该请求;)
  • 非常感谢,我会得到这个提琴手的东西。
【解决方案2】:

在您第一次尝试设置标头值时,您使用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 标头而不是标准 Authorization 标头。所以,当你这样做时:

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

它会生成一个名为Access-Token 的HTTP Header,其值为key。再次假设 key="foo",这将生成以下 HTTP 请求:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-11
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多