C 在gSoap服务器中执行服务器操作之前获取回调
在执行服务器操作之前,是否有方法从gSoap框架获取回调?我可以在文档中看到,有一个回调(fserveloop),它在服务器操作成功完成后立即调用,但不是在服务器操作完成之前 我之所以需要它,是因为程序接收来自多个套接字的请求,其中一个套接字应该只允许操作的一个子集。因此,需要在解析完成后执行访问检查,以便我们知道调用了哪个操作,但在执行该操作之前。或者也许有更好的方法 是否有一种方法可以在启动前从gSoap框架获取回调 是否执行服务器操作 您可以使用其他回调之一,例如被调用以解析HTTP头的C 在gSoap服务器中执行服务器操作之前获取回调,c,callback,gsoap,C,Callback,Gsoap,在执行服务器操作之前,是否有方法从gSoap框架获取回调?我可以在文档中看到,有一个回调(fserveloop),它在服务器操作成功完成后立即调用,但不是在服务器操作完成之前 我之所以需要它,是因为程序接收来自多个套接字的请求,其中一个套接字应该只允许操作的一个子集。因此,需要在解析完成后执行访问检查,以便我们知道调用了哪个操作,但在执行该操作之前。或者也许有更好的方法 是否有一种方法可以在启动前从gSoap框架获取回调 是否执行服务器操作 您可以使用其他回调之一,例如被调用以解析HTTP头的f
fparse
回调。您只需要确保之后调用原始的fparse
回调函数。像这样:
soap->user = (void*)soap->fparse; // save original callback to the user variable
soap->fparse = myfparse; // set new callback
在哪里
注:
soap->user
设置为包含数据的结构,并为您需要的原始fparse
函数指针设置一个成员,将数据传递到逻辑soap->user
设置为原始的fparse
函数后,才能在myfparse
中使用强制转换((int(*)(struct soap*)))fparse
回调函数。您只需确保之后调用原始的fparse
回调函数。如下所示:
soap->user = (void*)soap->fparse; // save original callback to the user variable
soap->fparse = myfparse; // set new callback
在哪里
注:
soap->user
设置为包含数据的结构,并为您需要的原始fparse
函数指针设置一个成员,将数据传递到逻辑soap->user
设置为原始的fparse
函数后,才能在myfparse
中使用强制转换((int(*)(struct soap*)))fparse回调在执行操作之前会给出回调,这将是执行访问控制的好地方。但是XML文档似乎还没有被解析,调用哪个操作还没有确定。我已经考虑过手动解析soap->buf,但我不太喜欢这个解决方案慢一点,可能会带来安全问题。我最终使用fparse回调,然后使用libxml在soap buf中手动解析XML文档。虽然这会导致文档被解析两次,但它仍然是可用的最佳选择。另一种方法:如果您想要更多的控制,那么我建议寻找
soap\u serve()
函数在生成的代码中,通常在soapServer.cpp
中。只需复制此函数并将其重命名,例如service
。然后将您的逻辑添加到保持活动循环的前面(即do while(soap->keep_alive)
循环)。然后使用重命名的service
函数,而不是soap\u serve
。我不是唯一一个参与此项目的人,随着我们向系统添加更多功能,代码会频繁重新生成。因此,更改生成的代码对我们来说不是一个可持续的选择。但感谢您的建议!fparse回调确实提供了一个ca在执行操作之前返回,这将是执行访问控制的好地方。但是XML文档似乎还没有被解析,调用哪个操作还没有确定。我已经考虑过手动解析soap->buf,但我不太喜欢这个解决方案,因为它速度慢,可能会引入安全性ty问题。我最终使用了fparse回调,然后使用libxml在soap buf中手动解析XML文档。虽然这会导致文档被解析两次,但它仍然是可用的最佳选择。另一种方法:如果您想要更多控制,那么我建议寻找soap\u serve()
函数在生成的代码中,通常在soapServer.cpp
中。只需复制此函数并将其重命名,例如service
。然后将您的逻辑添加到保持活动循环的前面(即do while(soap->keep_alive)
循环)。然后使用重命名的service
函数,而不是soap\u serve
。我不是唯一一个参与此项目的人,随着我们向系统添加更多功能,代码会频繁重新生成。因此,更改生成的代码对我们来说不是一个可持续的选择。但感谢您的建议!