IHttpFilter实现导致HttpClient::GetStringAsync调用触发访问违规
1. TestHttpFilter实现是否存在问题?
是的,你的实现有一个关键错误:SendRequestAsync成员函数被标记为const,但IHttpFilter接口中的同名方法并没有const修饰。
在WinRT的接口模型中,成员函数的签名(包括const修饰符)必须严格匹配接口定义。当你给SendRequestAsync加上const后,WinRT的implements机制无法正确将你的方法映射到IHttpFilter的接口方法上,导致调用时出现vtable错位,最终触发空指针访问(也就是你看到的0xC0000005错误)。
修复方法很简单,去掉const修饰符:
IAsyncOperationWithProgress<HttpResponseMessage, HttpProgress> SendRequestAsync(HttpRequestMessage const& request) { auto const result{ co_await inner_filter_.SendRequestAsync(request) }; co_return result; }
另外,你还可以把inner_filter_的初始化改成移动语义优化(非必须,但更符合WinRT对象的使用习惯):
TestHttpFilter(IHttpFilter inner_filter) : inner_filter_{ std::move(inner_filter) } {}
2. HTTP过滤器能否与HttpClient的便捷方法(如GetStringAsync)配合使用,还是必须通过SendRequestAsync接口?
完全可以配合使用!HttpClient的所有便捷方法(GetStringAsync、GetAsync、PostAsync等)内部最终都会调用SendRequestAsync,而SendRequestAsync会依次经过你构建的过滤器链。只要你的过滤器实现正确,这些便捷方法就能正常工作,不需要专门调用SendRequestAsync。
你之前遇到的崩溃问题是过滤器实现错误导致的,和便捷方法本身无关。
3. 是否可能是SDK头文件选择了不合适的operation对象构造函数导致问题?
在这个场景下,不太可能是SDK头文件的问题。你看到的空指针访问错误,根源是过滤器的成员函数签名不匹配,导致WinRT的底层调用机制出现错误,看起来像是put_abi的空指针解引用,但本质是代码实现不符合WinRT接口的要求。
这个问题可以通过修复SendRequestAsync的const修饰符完全解决,不需要修改SDK相关的内容。
内容的提问来源于stack exchange,提问作者IInspectable

