- 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/
我看到很多人发布关于 NullInjectorError: No provider for HttpClient! 的问题但是我在 Karma 单元测试中遇到了更具描述性的错误。我一直在学习 Angu
全部, 我创造: public static final HttpClient DEFAULT_HTTPCLIENT = HttpClients .createDefault(); f
我正在使用 HttpClient fluent api 编写验收测试,但遇到了一些麻烦。 @When("^I submit delivery address and delivery time$")
有人可以分享如何配置现代 HttpClient 4.5.3 以重试失败的请求并在每次重试前等待一段时间吗? 到目前为止,我似乎正确理解了 .setRetryHandler(new DefaultHtt
我在使用 java 中的 HttpClient 库时遇到问题。 目标网站在 SSL ( https://www.betcris.com ) 上,我可以从该网站加载索引页面就好了。 但是,显示不同运动赔
所以我的应用涉及大量网络调用(可能连接到 10 个不同的服务器)和获取数据。从我读过的几篇文章中,建议重用 HTTPClient 实例,因为它可以防止资源(套接字等)的浪费。但是我发现围绕可扩展且健壮
我正在调用一个外部 API,并希望我的 API 可以进行单元测试。为此,我正在尝试包装 HttpClient。我现在只需要一种方法。 这是我的界面。 public interface IHttpCli
出于调试目的,我希望看到将要发送的原始请求。有没有一种方法可以直接从 HttpPost 或 HttpClient 的API中获得没有HTTP监视器的信息? 我发现了一些“几乎”重复的问题,但不是针对这
我正在尝试在小型 WebAssemply 应用程序(使用 .NET 5 创建)中测试 HttpClient。program.cs 包含以下语句来添加 HttpClient 服务: builder.Se
我在 Application_Start 事件中创建了 HttpClient 的单个实例,以便在 Global.asax.cs 中的应用程序中重用 应用程序启动中的代码: protected
我对此有点新手...基本上我需要运行一个脚本来从谷歌趋势下载.csv 文件。我按照这个reference写了下面的代码,代码如下: HttpClient client = new Defau
我正在尝试实现一个基本的 1 spout - 1 bolt Storm 拓扑。我有一个 Storm Bolt,可以使用 Apache HttpClient (4.3.1) 发出 HTTP 请求。但是,
我正在尝试在我的 Xamarin.Forms 移动应用程序中使用 HttpClient 创建网络服务层。 没有单例模式 单例模式 在第一种方法中,我在每个新请求中创建新的 http 客户端对象通过移动
在下面的示例中,我创建了一个 Java 11 httpClient,然后创建了多个并发 HttpRequest。 这是不好的做法吗? 每个 HttpRequest 都应该有自己的 HttpClient
我正在开发一个 Drupal 8 自定义模块。我在任何节点类型中都有两个字段(url 和文本 html 字段)。这是该模块所期望的功能: 该模块将抓取“url字段”的页面并复制html代码以将它们粘贴
我正在为 httpclient 使用 apache httpcompnonents 库。我想在多线程应用程序中使用它,其中线程数会非常高,并且会有频繁的 http 调用。这是我用来在执行调用后读取响应
最近我将我的代码库从 .net core 1.0 迁移到 2.0 。之后,我随机收到错误 “使用 System.Net.Http.HttpClient 时服务器返回无效或无法识别的响应错误”。我在 1
我有该代码: while(!lastPage && currentPage < maxPageSize){ StringBuilder request = new Strin
我的应用程序使用 Apache HTTPClient 4.3.5 发送 HTTP 请求并获得响应。 我想弄清楚应用程序收到了什么响应。 以下是日志片段- [Jan 04 2015 05:38:14.1
如何从 HttpClient 类型的现有对象获取 cookie? 我正在使用 HttpClient 版本 4.3.3,它不再有方法 httpClient.getCookieStore() 了。 最佳答
我是一名优秀的程序员,十分优秀!