- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在开发一个进行 API 调用的 Windows 运行时组件。直到今天早些时候,我还使用 HttpClient
和 System.Net
中的相关模型,但切换到 Windows.Web
以利用 WinRT 流。
除了更改 using
语句,将 HttpContent
交换为 IHttpContent
并使用 WindowsRuntimeExtensions
更改我的 IInputStream
到 JSON.NET 的 Stream
,我不需要做任何特别的事情。然而突然之间,我的 16 个测试中有 3 个失败了,而之前一切正常。
所有 3 个(集成)测试都验证了我在使用无效凭据登录时收到错误响应。还有其他测试也包括登录(但使用有效凭据)并且它们工作正常。给定的错误消息是 AggregateException
类型并且有消息
System.AggregateException
: One or more errors occurred. --->System.Exception
: Element not found.A dialog cannot be displayed because the parent window handle has not been set.
异常包含 HRESULT 值。 outerexception 的值 -2146233088
对应于 0x80131500
而 innerexception 的值 -2147023728
对应于 0x80070490
。这些都不是 the MSDN page 上的已知错误代码.
以下调查:
0x80131500
corresponds to COR_E_EXCEPTION
0x80070490
corresponds to ERROR_NOT_FOUND
堆栈跟踪:
Result StackTrace:
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at xx.Models.Requests.GetRequest.<ExecuteRequestAsync>d__0.MoveNext() in c:\Users\jeroen\Github\Windows-app\xx\xx\Models\Requests\Request.cs:line 17
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at xx.ApiDispatcher.<ExecuteAsync>d__0`2.MoveNext() in c:\Users\jeroen\Github\Windows-app\xx\xx\ApiDispatcher.cs:line 40
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
at System.Threading.Tasks.Task`1.get_Result()
at xx.ApiDispatcher.Execute[TCallResult,TResponseObject](ApiCall`2 call) in c:\Users\jeroen\Github\Windows-app\xx\xx\ApiDispatcher.cs:line 22
最初我的问题措辞有所不同,因为实际问题似乎被隐藏了。我发现 HttpClient
的 GET 请求返回给调用者,而不是等待调用的结果(并执行方法的其余部分)。
在我的项目中,执行行 var data = await myHttpClient.GetAsync(url);
将返回到带有非构造对象的调用方法以及 之后的后续行GetAsync()
调用根本不会执行。
添加 .ConfigureAwait(false)
以阻止它返回并没有什么不同。
AggregateException
当用户尝试使用无效凭据登录时抛出。出于某种原因,HttpClient
决定抛出异常,但没有给我可以使用的返回值。这里的问题是它没有告诉我是哪种异常:捕获COMException
、TaskCanceledException
、AggregateException
和Exception
只触发后者。
我还发现异步集成测试不能很好地与多线程 MSTest 环境一起工作,所以这解释了我有几个其他失败的测试(但单独工作得很好)
最后,我还有一个演示问题的示例(但我无法提供采用基本身份验证的网络服务)!
[TestMethod]
public void TestMethod3()
{
Assert.IsTrue(new Test().Do().AsTask().Result);
}
public sealed class Test
{
public IAsyncOperation<bool> Do()
{
return DoSomething().AsAsyncOperation();
}
private async Task<bool> DoSomething()
{
var client = new HttpClient();
var info = "jeroen.vannevel@something.com:nopass";
var token = Convert.ToBase64String(Encoding.UTF8.GetBytes(info));
client.DefaultRequestHeaders.Authorization = new HttpCredentialsHeaderValue("Basic", token);
var data = await client.GetAsync(new Uri("https://mytestdomain/v2/apikey?format=Json"));
return true;
}
}
使用有效密码执行此代码将返回 true
,而无效密码将抛出 AggregateException
。
现在我正在解决这个问题,方法是在调用 GetAsync()
时捕获一般的 Exception
,但这是非常基本的,我想知道为什么首先抛出这个不完整的异常。
最佳答案
在重建您的示例并试玩之后,我明白了会发生什么。
var data = await client.GetAsync(new Uri("https://mytestdomain/v2/apikey?format=Json"));
GetAsync
方法使用无效凭据调用 HTTP 请求。发生的情况是返回的请求试图寻找一个窗口,您可以在其中输入正确的凭据,但没有找到。因此,它会在搜索该窗口时抛出 Element Not Found
。
这可以通过创建 HttpBaseProtocolFilter
并将 AllowUI
属性设置为 false
然后将其传递给 HttpClient< 来解决
:
private async Task<bool> DoSomething()
{
var httpBaseFilter = new HttpBaseProtocolFilter
{
AllowUI = false
};
var client = new HttpClient(httpBaseFilter);
var info = "jeroen.vannevel@something.com:nopass";
var token = Convert.ToBase64String(Encoding.UTF8.GetBytes(info));
client.DefaultRequestHeaders.Authorization = new HttpCredentialsHeaderValue("Basic", token);
var data = await client.GetAsync(new Uri("https://mytestdomain/v2/apikey?format=Json"));
return true;
}
关于c# - 当无效凭据与基本身份验证一起使用时,Windows.Web.Http.HttpClient#GetAsync 引发不完整的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24361588/
我想知道为什么当我在 postman 中尝试它有数据返回时它返回空值。这是我的代码。 public async Task> GetUserJobs(LoginResult token) { v
我有一个要测试的 API。这是一个方法的签名... [HttpGet("{param}")] public async Task Get(string param, string param2) {
我有一个函数可以从 Web 服务获取大量 JSON。该数据有时可能很大,达到千兆字节。我的通话如下所示。 try { using (var ht
使用 VS 2017 社区。 azure 。 我有 Azure 设置,我创建了一个空白 Web 应用程序仅用于测试目的。 我的实际站点是 Angular2 MVC5 站点,当前在本地运行。 以下代码应
我是新手,如果这是一个愚蠢的问题,我很抱歉。 我正在尝试创建 Office 插件的一些操作。 我想要它做的是获取您正在撰写的 session 的开始时间并将其放入 HTML div 中。这是我的 .j
如果这个问题之前已经被回答过,我很抱歉,但没有一个答案对我有帮助。我的 WebView 有一个事件: private async void MainWebView_UnviewableContentI
我有大量的异步请求。在某些时候,当应用程序被停用(暂停)时,我需要取消所有请求。我正在寻找一种解决方案来取消异步方法之外的请求。有人可以指出我正确的方向吗? 这是代码块。 异步方法: public a
当使用 Postman 测试我的 Web API 时,我的 API 执行得很好! 当谈到在我的客户端应用程序中使用 HttpClient 运行代码时,代码执行时没有错误,但在服务器上没有预期的结果。会
我使用MVVM-Light开发通用应用。 在一个页面上,有一个来自 WebService 的评论列表。如果当前用户是评论的作者,我会显示一个 FlyoutMenu 允许他“编辑”或“删除”其评论。还有
我一直在尝试构建一个作为 WebService 运行的 Windows ConsoleApp 来来回同步一些数据我已经构建了一个用于同步的项目,当我在我的 wpf 项目中运行它时它似乎可以工作但事实并
我对 web 服务和 rest 还很陌生,目前正在研究 servicestack。 我有以下有效的代码: var response = client.Get(SettingsManager.getMe
当使用 HttpClient 并执行 PostAsync 时,我能够添加与 HttpContent 的契约(Contract)。例如 HttpContent content = new ObjectC
我们有一个面向微服务的后端堆栈。所有构建在 Nancy 之上的微服务并使用 topshelf 注册为 Windows 服务. 处理大部分流量(~5000 请求/秒)的服务之一开始在 8 台服务器中的
我目前正在使用 HttpWebRequest 获取网站。我想使用 HttpWebRequests 未提供的等待模式。我找到了 HttpClient 类,它似乎是新的 Http worker 类。我正在
我有一个托管在 Azure 中的 ASP.NET WebApi。它没有基于 HTTP header 或 Azure API 身份验证,并且 fiddler session 证明该 API 功能齐全,并
我有一个使用 Office Javascript API 开发的 Outlook 插件。 它会查看正在撰写的新电子邮件,并根据收件人执行操作:https://learn.microsoft.com/e
我不熟悉async/await到底是如何工作的。为了更好地理解它,我创建了下面的示例代码: static void Main(string[] args) { GetA
我不熟悉async/await到底是如何工作的。为了更好地理解它,我创建了下面的示例代码: static void Main(string[] args) { GetA
所以我在关注 tutorial to build an Outlook Add-in .但是,该演示不显示消息的 body。 我还从文档中了解到,我可以调用 getAsync 来访问正文,但它不起作用
我有一个服务使用 HttpClient 类从其他服务获取一些资源。作为我们性能测试的一部分,我们模拟了 HttpClient.GetAsync() 调用以从外部服务中删除依赖项,并将其替换为从本地磁盘
我是一名优秀的程序员,十分优秀!