相关疑难解决方法(0)

使用await/async时,HttpClient.GetAsync(...)永远不会返回

编辑: 这个问题看起来可能是同一个问题,但没有回复......

编辑:在测试用例5中,任务似乎陷入WaitingForActivation状态.

我在.NET 4.5中使用System.Net.Http.HttpClient遇到了一些奇怪的行为 - 其中"等待"调用(例如)的结果httpClient.GetAsync(...)将永远不会返回.

只有在使用新的async/await语言功能和Tasks API时才会出现这种情况 - 在仅使用continuation时,代码似乎始终有效.

下面是一些重现问题的代码 - 将其放入Visual Studio 11中新的"MVC 4 WebApi项目"中,以显示以下GET端点:

/api/test1
/api/test2
/api/test3
/api/test4
/api/test5 <--- never completes
/api/test6
Run Code Online (Sandbox Code Playgroud)

这里的每个端点都返回相同的数据(来自stackoverflow.com的响应头),除非/api/test5从未完成.

我在HttpClient类中遇到过错误,还是以某种方式滥用了API?

代码重现:

public class BaseApiController : ApiController
{
    /// <summary>
    /// Retrieves data using continuations
    /// </summary>
    protected Task<string> Continuations_GetSomeDataAsync()
    {
        var httpClient = new HttpClient();

        var t = httpClient.GetAsync("http://stackoverflow.com", HttpCompletionOption.ResponseHeadersRead);

        return t.ContinueWith(t1 => t1.Result.Content.Headers.ToString());
    }

    /// <summary>
    /// Retrieves data using async/await
    /// …
Run Code Online (Sandbox Code Playgroud)

.net c# asynchronous async-await dotnet-httpclient

297
推荐指数
3
解决办法
17万
查看次数

阅读回复中的文字

HttpWebRequest request = WebRequest.Create("http://google.com") as HttpWebRequest;  

request.Accept = "application/xrds+xml";  
HttpWebResponse response = (HttpWebResponse)request.GetResponse();  

WebHeaderCollection header = response.Headers;
Run Code Online (Sandbox Code Playgroud)

谷歌在这里返回文字.怎么看?

c# asp.net

66
推荐指数
3
解决办法
16万
查看次数

等待与异步方法中的Task.Result

执行以下操作之间有什么区别:

async Task<T> method(){
    var r = await dynamodb.GetItemAsync(...)
    return r.Item;
}
Run Code Online (Sandbox Code Playgroud)

VS

async Task<T> method(){
    var task = dynamodb.GetItemAsync(...)
    return task.Result.Item;
}
Run Code Online (Sandbox Code Playgroud)

在我的情况下,由于某种原因,只有第二个工作.第一个似乎永远不会结束.

c# asynchronous task async-await amazon-dynamodb

32
推荐指数
2
解决办法
6万
查看次数

HttpClient.PostAsJsonAsync永远不会看到帖子成功和响应的时间

我们正在使用HttpClient将json发布到一个宁静的Web服务.在一个例子中,我们遇到了困扰我们的事情.使用postman,fiddler等工具,我们可以发布到端点并看到它正在工作.当我们对HttpClient.PostAsJsonAsync做同样的事情时,我们可以在我们发布的软件中验证它收到的数据就好了.但是,我们的PostAsJsonAsync总是最终超时,而不是给我们一个响应.

我们与创建我们正在消费的服务的团队合作,加上我们的额外测试,我们还没有真正超时的服务.

每次我们使用HttpClient发布帖子时,我们都可以验证我们发布的目标软件是否确实获得了数据.每当我们从任何其他工具发布到目标软件的帖子时,我们总是很快看到状态代码为200的响应.关于HttpClient的某些内容未能接受来自此特定服务的响应.有没有人知道我们可以从这里看到什么?

这是代码(虽然它是如此千篇一律,我几乎觉得不需要)

public string PostData(string resourcePath, Object o, Boolean isCompleteUrl = false, int timeoutMinutes = -1)
    {
        using (var client = new HttpClient())
        {
            if (timeoutMinutes > 0)
            {
                client.Timeout = new TimeSpan(0,timeoutMinutes,0);
            }
            var useUrl = isCompleteUrl ? resourcePath : ApiBase + resourcePath;
            var response = client.PostAsJsonAsync(useUrl, o).Result;
            if(response.StatusCode == System.Net.HttpStatusCode.OK)
            {
                return response.Content.ReadAsStringAsync().Result;
            }
            return "";
        }

    }
Run Code Online (Sandbox Code Playgroud)

c# connection-timeout async-await dotnet-httpclient

11
推荐指数
4
解决办法
2万
查看次数

ExecuteAsync 不会将控制权返回给调试器

我正在尝试使用 MSAL.NET 获取令牌,并且几乎使用他们的开箱即用的教程代码。

using Microsoft.Identity.Client;
using MyApp.Interfaces;
using System;
using System.Threading.Tasks;

namespace MyApp.NetworkServices
{
    public class MyAuthorizationClient : IMyAuthorizationClient
    {
        private readonly string[] _resourceIds;
        private IConfidentialClientApplication App;

        public MyAuthorizationClient(IMyAuthenticationConfig MyAuthenticationConfig)
        {
            _resourceIds = new string[] { MyAuthenticationConfig.MyApimResourceID };

            App = ConfidentialClientApplicationBuilder.Create(MyAuthenticationConfig.MyApimClientID)
                .WithClientSecret(MyAuthenticationConfig.MyApimClientSecret)
                .WithAuthority(new Uri(MyAuthenticationConfig.Authority))
                .Build();
        }

        public async Task<AuthenticationResult> GetMyAccessTokenResultAsync()
        {
            AuthenticationResult result = null;

            try
            {
                result = await App.AcquireTokenForClient(_resourceIds).ExecuteAsync().ConfigureAwait(continueOnCapturedContext:false);
            }
            catch(MsalClientException ex)
            {
                ...
            }
            return result;            
    }
}
Run Code Online (Sandbox Code Playgroud)

}

我遇到的问题是,在await通话中,它永远不会返回。调试器不会恢复控制,并且应用程序会转到前台,就好像它继续运行一样。我无法询问 的结果result,并且我已经将 的配置await …

.net c# concurrency async-await azure-ad-msal

5
推荐指数
1
解决办法
2352
查看次数