gpt4 book ai didi

c# - 当无效凭据与基本身份验证一起使用时,Windows.Web.Http.HttpClient#GetAsync 引发不完整的异常

转载 作者:IT王子 更新时间:2023-10-29 04:34:18 25 4
gpt4 key购买 nike

我正在开发一个进行 API 调用的 Windows 运行时组件。直到今天早些时候,我还使用 HttpClientSystem.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 上的已知错误代码.

以下调查:

堆栈跟踪:

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 决定抛出异常,但没有给我可以使用的返回值。这里的问题是它没有告诉我是哪种异常:捕获COMExceptionTaskCanceledExceptionAggregateExceptionException 只触发后者。

我还发现异步集成测试不能很好地与多线程 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;
}

Response after adding HttpBaseProtocolFilter

关于c# - 当无效凭据与基本身份验证一起使用时,Windows.Web.Http.HttpClient#GetAsync 引发不完整的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24361588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com