编辑: 这个问题看起来可能是同一个问题,但没有回复......
编辑:在测试用例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
从未完成.
代码重现:
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) 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)
谷歌在这里返回文字.怎么看?
执行以下操作之间有什么区别:
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)
在我的情况下,由于某种原因,只有第二个工作.第一个似乎永远不会结束.
我们正在使用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) 我正在尝试使用 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 …