HttpSendHttpResponse未发送数据

HttpSendHttpResponse未发送数据,http,winapi,smalltalk,httpserver,Http,Winapi,Smalltalk,Httpserver,我正在使用mshttpserverapiv2(在同步模式下)实现一个web服务器,并试图从web浏览器中测试它 我从浏览器向发送GET请求,并且我的应用程序正确地接收到它。然后我使用HttpSendHttpResponse发送响应,其中包含(HTTP\u data\u CHUNK)中的一些数据,并且发送了131个字节。但是,浏览器未接收任何数据。 我还使用wininet客户端对其进行了测试,结果相同 这是我的发送响应代码(Smalltalk): 你知道为什么如果HttpSendHttpRespo

我正在使用
mshttpserverapi
v2(在同步模式下)实现一个web服务器,并试图从web浏览器中测试它

我从浏览器向发送GET请求,并且我的应用程序正确地接收到它。然后我使用
HttpSendHttpResponse
发送响应,其中包含(
HTTP\u data\u CHUNK
)中的一些数据,并且发送了131个字节。但是,浏览器未接收任何数据。 我还使用
wininet
客户端对其进行了测试,结果相同

这是我的发送响应代码(Smalltalk):

你知道为什么如果HttpSendHttpResponse函数成功并指示已发送n个字节,客户端就不会收到数据吗

谢谢,
塞巴斯蒂安

我已经解决了这个问题。我在对齐
HTTP\u DATA\u CHUNK
结构时出错,因为某些字段对齐了8个字节,所以数据指针的偏移量不好。 修复了这个问题后,我再次尝试只使用
HttpSendHttpResponse
,但没有成功,然后对标题使用
HttpSendHttpResponse
,对数据使用
HttpSendHttpResponseEntityBody
,效果很好!也许这本书已经过时了。在那里,数据与响应一起发送到
HttpSendHttpResponse


非常感谢您,Sebastian

如果您不知道您不会在浏览器(网络检查器之外)中看到这一点,因为
HttpSendHttpResponse
用于HTTP头,
HttpSendResponseEntityBody
用于数据谢谢@AlexK.,我知道
HttpSendHttpResponse
也可以在一次调用中发送数据。我正在跟踪MSDN示例[,在那里,一些文本被发送到数据块缓冲区中,使用
HttpSendHttpResponse
。无论如何,我将尝试调用
HttpSendResponseEntityBody
。我不知道它能做到这一点,他说“HttpSendHttpResponse函数用于创建和发送响应标头,HttpSendResponseEntityBody函数可用于根据需要发送实体正文数据。“使用不带数据和标志的
HttpSendHttpResponse
HTTP\u SEND\u RESPONSE\u FLAG\u MORE\u data
,然后使用数据和标志=
HTTP\u SEND\u RESPONSE\u FLAG\u DISCONNECT
调用
HttpSendResponseEntityBody
,得到相同的结果。浏览器显示一个空页面。
sendResponse: aString
    | data response sent id return |
    data := HTTP_DATA_CHUNK external 
    data 
        DataChunkType: 0;
        pBuffer: aString copyToExternalMemory;
        BufferLength: aString size.
    response := HTTP_RESPONSE_V2 external.
    response
        version1;
        StatusCode: HTTP_STATUS_OK;
        reason: 'Ok';
        ContentType: 'text/html';
        EntityChunkCount: 1;
        dataChunk: data.
    sent := ExternalLong external.
    return := HttpServerDLL current
        HttpSendHttpResponse: handle
        RequestId: request id
        Flags: 0
        pHttpResponse: response asParameter
        pCachePolicy: 0
        pBytesSent: sent asParameter
        pReserved2: 0
        Reserved3: 0
        pOverlapped: 0
        pLogData: 0.
    return = 0 ifFalse: [^self osError: return].
    ^sent asInteger