SimpleXMLRPCServer 请求分发问题

3 投票
1 回答
784 浏览
提问于 2025-04-16 20:26

我们正在开发一个基于XML-RPC的客户端-服务器应用程序。服务器需要在每次请求时知道每个客户端的IP地址。

为了解决这个问题,我们把SocketServer.ThreadingMixIn混合到SimpleXMLRPCServer中,并且重写了SimpleXMLRPCRequestHandler的_dispatch方法。下面是代码:

class ThreadedXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
    pass

class RequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
    def _dispatch(self, method, params):
        function = self.server.funcs[method]

        def decor(function, ip_addr):
            def new_function(*args):
                try:
                    return function(ip_addr, *args)
                except Exception, err:
                    log_msg('Exception ocurred in XMLRPC thread (%s)!' % err)

            return new_function

        return decor(function, self.client_address[0])(*params)

问题是,有时候请求的IP地址和请求的数据会搞混,也就是说,请求的IP地址和实际的地址不匹配。

是不是_dispatch的最后一行有问题,或者我们遗漏了什么?

谢谢!

1 个回答

0

你可能应该在自定义的 _dispatch 方法中重新抛出任何在调用 function(ip_addr ...) 时遇到的异常,否则你可能会绕过内置的错误处理机制。

我想表达的是……

class RequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
    def _dispatch(self, method, params):
        function = self.server.funcs[method]

        def decor(function, ip_addr):
            def new_function(*args):
                try:
                    return function(ip_addr, *args)
                except Exception, err:
                    log_msg('Exception ocurred in XMLRPC thread (%s)!' % err)
                    raise # <---- re-raise

            return new_function

……不过,我会很惊讶这和你的问题有关。就我所知,你现在的代码应该是没问题的。

顺便问一下,如果你改为继承 ForkingMixin 会发生什么呢?

撰写回答