WinHttpReceiveResponse()始终返回ERROR_INTERNET_INCORRECT_HANDLE_STATE

时间:2013-10-01 00:03:40

标签: winapi iis-7 winhttp smooth-streaming

我正在尝试将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),那么它可以工作,但我需要那个分块编码。有解决方案吗?

0 个答案:

没有答案