我正在尝试将 WinHTTP 身份验证添加到我的应用程序。应用程序应连接到 IIS 并流式传输一些数据。在使用 API(传输编码:分块)发送一些分块数据后WinHttpWriteData()
,我可以在网络监视器中看到 IIS 以 401(未经授权)响应。但是,如果我调用WinHttpReceiveResponse()
以检索该响应,该 API 总是失败并显示ERROR_INTERNET_INCORRECT_HANDLE_STATE
. 文档没有定义“状态”,所以对我来说几乎没有意义。我还应该提到,如果我为所有用户创建授权规则而无需任何身份验证,我可以毫无问题地与 IIS 通信。此外,当我在 IIS 上尝试时,MSDN 中提供的有关 WinHTTP 身份验证的示例都不起作用。
未经授权的工作示例:
// Send the chunk size
WinHttpWriteData( httpPostRequest, httpChunkData, (DWORD)strlen( httpChunkData ), &dwWritten );
// Send the data
WinHttpWriteData( httpPostRequest, pData, size, &dwWritten );
// Send the end
WinHttpWriteData( httpPostRequest, "\r\n", 2, &dwWritten );
401 在最后一个之后到达WinHttpWriteData()
,但我无法得到它WinHttpReceiveResponse()
。
如果有人能提供几行伪代码来说明如何做到这一点,我将不胜感激。
编辑:我在同步模式下使用 WinHTTP。
编辑#2:上述描述与基本身份验证有关。我禁用了它并启用了 Windows 身份验证。我已经多次阅读http://msdn.microsoft.com/en-us/library/windows/desktop/aa383144(v=vs.85).aspx,结果是:
WinHttpSendRequest() - SUCCESS
WinHttpReceiveResponse() - SUCCESS
WinHttpQueryHeaders() - SUCCESS, status code = 401
WinHttpQueryAuthSchemes() - SUCCESS, auth scheme = WINHTTP_AUTH_SCHEME_NEGOTIATE
WinHttpSetCredentials() - SUCCESS
now I repeat the first two calls:
WinHttpSendRequest() - SUCCESS
WinHttpReceiveResponse() - FAILURE with code ERROR_WINHTTP_CONNECTION_ERROR
似乎登录 IIS 显示用户名/密码不正确。我什至尝试以管理员身份登录,但它也不起作用。不幸的是,糟糕的 MS 文档中缺少一些非常重要的东西。
编辑#3
发现问题!
WinHttpSendRequest( hPostRequest,
L"Transfer-Encoding: Chunked\r\n",
(DWORD)-1,
WINHTTP_NO_REQUEST_DATA,
0,
WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH,
0 );
如果我删除了额外的标头(传输编码:分块),那么它可以工作,但我需要分块编码。有解决方案吗?