我正在尝试将WinHTTP身份验证添加到我的应用程序中。应用程序应连接到IIS并传输一些数据。在使用WinHttpWriteData()
API(Transfer-Encoding:Chunked)发送一些分块数据后,我可以在网络监视器中看到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:编辑#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 );
如果我删除其他标头(Transfer-Encoding:Chunked),那么它可以工作,但我需要那个分块编码。有解决方案吗?