Я нахожусь в процессе выделения OAuth-аутентификации в IHttpFilter для использования с HttpClient .Я использую следующий код для тестирования, ожидая, что он просто перенаправит все запросы в HttpBaseProtocolFilter :
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Web.Http.h>
#include <winrt/Windows.Web.Http.Filters.h>
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Web::Http;
using namespace Windows::Web::Http::Filters;
struct TestHttpFilter : implements<TestHttpFilter, IHttpFilter>
{
TestHttpFilter(IHttpFilter inner_filter) : inner_filter_{ inner_filter } {}
IAsyncOperationWithProgress<HttpResponseMessage, HttpProgress> SendRequestAsync(HttpRequestMessage const& request) const
{
auto const result{ co_await inner_filter_.SendRequestAsync(request) };
co_return result;
}
private:
IHttpFilter inner_filter_{ nullptr };
};
int main()
{
init_apartment();
IHttpFilter const base_filter{ HttpBaseProtocolFilter{} };
IHttpFilter const test_filter{ TestHttpFilter{ base_filter } };
HttpClient const http_client{ test_filter };
auto const result{ http_client.GetStringAsync({ L"http://aka.ms/cppwinrt" }).get() };
printf("Response: %ls!\n", result.c_str());
}
Цепочка фильтров правильно создана и передана в HttpClient
не могу.При выполнении вызова GetStringAsync
код падает внутри TestHttpFilter::SendRequestAsync
со следующей ошибкой:
Exception thrown at <address> in <app>.exe: 0xC0000005: Access violation reading location 0x0000000000000000.
Это выглядит как указатель NULL, разыменованный в вызове put_abi
внутри заголовочного файла SDK (пространства имен опущены для краткости):
template <typename D> IAsyncOperationWithProgress<HttpResponseMessage, HttpProgress> consume_Windows_Web_Http_Filters_IHttpFilter<D>::SendRequestAsync(HttpRequestMessage const& request) const
{
IAsyncOperationWithProgress<HttpResponseMessage, HttpProgress> operation{ nullptr };
check_hresult(WINRT_SHIM(IHttpFilter)->SendRequestAsync(get_abi(request), put_abi(operation)));
return operation;
}
Я не понимаю, где я ошибся с этим.Я надеюсь разобраться в этом с ответами на следующие вопросы:
- Что-то не так с реализацией
TestHttpFilter
? - Можно ли использовать фильтры HTTP с удобными реализациями
HttpClient
(например, GetStringAsync
), или мы должны пройти через интерфейс SendRequestAsync
при использовании фильтров? - Весьма маловероятно, но может ли это быть проблемой сгенерированных заголовков SDK, выбравнеподходящий c'tor для локального
operation
объекта?
Я могу воспроизвести проблему, используя официальную версию Windows SDK 10.0.17134.0.