我在Linux机器上创建了一个Python Web服务(ubuntu):
import soaplib
import os
from soaplib.core.service import rpc, DefinitionBase, soap
from soaplib.core.model.primitive import String, Integer
from soaplib.core.server import wsgi
from soaplib.core.model.clazz import Array
def runcmd(cmd):
fout = os.popen(cmd)
out = fout.read()
return out
class LinuxServices(DefinitionBase):
@soap(String, String,_returns=Array(String))
def df(self,server, user):
L = []
cmd = 'df -hP | grep "/"'
output = runcmd(cmd).split('\n')
for n in xrange(len(output)-1):
out = output[n].split()
L.append('%s;%s' % (out[5], out[4]))
return L
if __name__=='__main__':
try:
from wsgiref.simple_server import make_server
soap_application = soaplib.core.Application([LinuxServices], 'tns')
wsgi_application = wsgi.Application(soap_application)
server = make_server('0.0.0.0', 7789, wsgi_application)
server.serve_forever()
except ImportError:
print "Error: example server code requires Python >= 2.5"
我是根据这个例子创建的:soaplib helloworld
然后(在Windows 7上)我创建了一个Silverlight项目,在那里我使用这个ws来获取我的linux服务器上的磁盘状态:
Silverlight项目中的服务:
public class LinuxService
{
[OperationContract]
public List<dfItem> df()
{
List<dfItem> dfItems = new List<dfItem>();
WebReference.Application app = new WebReference.Application();
var result = app.df(new WebReference.df()/*...*/);
foreach (var item in result.dfResult)
{
string[] info = item.Split(';');
dfItem dfItem = new dfItem()
{
MountPoint = info[0].ToString(),
Usage = info[1].ToString()
};
dfItems.Add(dfItem);
}
return dfItems;
}
//...
}
在页面上调用服务:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
LinuxServiceClient client = new LinuxServiceClient();
client.dfCompleted += new EventHandler<dfCompletedEventArgs>(client_dfCompleted);
client.dfAsync();
}
void client_dfCompleted(object sender, dfCompletedEventArgs e)
{
DG.ItemsSource = e.Result;
DG.Visibility = System.Windows.Visibility.Visible;
}
我的问题是,当我导航到这个页面时,从ws(局域网中的ws)获取数据需要4-8秒。
我真的怀疑线路带宽可以创造这个等待时间......
我的问题: 您有什么建议我可以做些什么来加速这个?
系统信息:
UbuntuServer 11.04
Python:Python 2.7
Soaplib:soaplib 2.0.0-beta2
Windows:Windows 7 sp1
Silverlight:Silverlight 4
答案 0 :(得分:3)
我建议使用wireshark http://www.wireshark.org/通过记录(“捕获”)设备可以看到的网络流量副本来“监听”网络上发生的对话。
当你开始捕获时,数据量可能看起来很大,但是如果你能发现看起来像你的SOAP消息的任何片段(应该很容易发现),那么你可以通过正确的方式迅速过滤到那个对话 - 单击并选择“关注TCP流”。
然后,您可以在弹出窗口中查看您编写的SOAP服务与silverlight客户端之间的整个对话。
如果一切正常,请关闭弹出窗口。作为一个额外的好处,wireshark会将片段列表过滤掉,只是会话中的那些片段,时间戳,以确定它们何时发生。使用它来确定它的客户端或服务器是否响应缓慢。
如果看起来没有真正的延迟,那么我会建议让Silverlight进行SOAP调用并实际进行网络调用之间存在相当大的滞后。
答案 1 :(得分:1)
使用suds客户端和soaplib hello world示例只是一个粗略的基准:
>>> def bench_soap(num):
...: start = time.time()
...: for i in range(num):
...: hello_client.service.say_hello("Dave", 5)
...: elapsed = time.time() - start
...: print "Completed %s: ops in %.2f seconds : %.1f ops/sec" % (num, elapsed, num / elapsed)
...:
...:
>>> bench_soap(100)
Completed 100: ops in 0.40 seconds : 247.5 ops/sec
>>> bench_soap(1000)
Completed 1000: ops in 3.81 seconds : 262.5 ops/sec
在我看来,我没有看到任何“滞后”或类似的东西。 Soaplib,似乎快速响应,所以也许是一个Silverlight问题?或者两者之间有某种不相容?