C 在gSoap服务器中执行服务器操作之前获取回调

C 在gSoap服务器中执行服务器操作之前获取回调,c,callback,gsoap,C,Callback,Gsoap,在执行服务器操作之前,是否有方法从gSoap框架获取回调?我可以在文档中看到,有一个回调(fserveloop),它在服务器操作成功完成后立即调用,但不是在服务器操作完成之前 我之所以需要它,是因为程序接收来自多个套接字的请求,其中一个套接字应该只允许操作的一个子集。因此,需要在解析完成后执行访问检查,以便我们知道调用了哪个操作,但在执行该操作之前。或者也许有更好的方法 是否有一种方法可以在启动前从gSoap框架获取回调 是否执行服务器操作 您可以使用其他回调之一,例如被调用以解析HTTP头的f

在执行服务器操作之前,是否有方法从gSoap框架获取回调?我可以在文档中看到,有一个回调(fserveloop),它在服务器操作成功完成后立即调用,但不是在服务器操作完成之前

我之所以需要它,是因为程序接收来自多个套接字的请求,其中一个套接字应该只允许操作的一个子集。因此,需要在解析完成后执行访问检查,以便我们知道调用了哪个操作,但在执行该操作之前。或者也许有更好的方法

是否有一种方法可以在启动前从gSoap框架获取回调 是否执行服务器操作

您可以使用其他回调之一,例如被调用以解析HTTP头的
fparse
回调。您只需要确保之后调用原始的
fparse
回调函数。像这样:

soap->user = (void*)soap->fparse; // save original callback to the user variable
soap->fparse = myfparse;          // set new callback
在哪里

注:

  • 您可以在解析HTTP头之前或之后添加逻辑
  • 您可以通过将
    soap->user
    设置为包含数据的结构,并为您需要的原始
    fparse
    函数指针设置一个成员,将数据传递到逻辑
  • 只有在确保将
    soap->user
    设置为原始的
    fparse
    函数后,才能在
    myfparse
    中使用强制转换((int(*)(struct soap*)))
  • 是否有一种方法可以在启动前从gSoap框架获取回调 是否执行服务器操作

    您可以使用其他回调函数之一,例如被调用以解析HTTP头的
    fparse
    回调函数。您只需确保之后调用原始的
    fparse
    回调函数。如下所示:

    soap->user = (void*)soap->fparse; // save original callback to the user variable
    soap->fparse = myfparse;          // set new callback
    
    在哪里

    注:

  • 您可以在解析HTTP头之前或之后添加逻辑
  • 您可以通过将
    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
    。我不是唯一一个参与此项目的人,随着我们向系统添加更多功能,代码会频繁重新生成。因此,更改生成的代码对我们来说不是一个可持续的选择。但感谢您的建议!