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