private void button1_click(object sender, system.eventargs e)
{
dataset ds = new dataset();
ds.readxml(application.startuppath+@"\test.xml");
printwebservice.proxy.service proxy = new printwebservice.proxy.service();
proxy.createimage(ds);
if (proxy.responsesoapcontext.attachments.count != 0)
{
b = new bitmap(proxy.responsesoapcontext.attachments[0].stream);
this.picturebox1.image = b;
}
}
在这里,我们用dataset载入xml,并调用webservice返回图象stream,可以看到,客户端的工作变得非常简单,只需要调用个webservice就可以,wse对于附件的支持完成的很好,代码也极为的简单。我还做了一步打印预览的工作来测试我创建的图片,如下:

至此,我们就大功告成了。
注意事项:
 需在web服务项目中的web.config内加入以下语句,以保证代码的正确运行。
<webservices>
<soapextensiontypes>
dd type="microsoft.web.services.webservicesextension,microsoft.web.services,version=1.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35"
priority="1" group="0"/>
</soapextensiontypes>
</webservices>
否则web服务代码里的soapcontext sc = httpsoapcontext.responsecontext; sc将永远返回null值。
 尽管在我的测试下web服务所表现出来的性能相当ok,但是在实际运用中,朋友们还得仔细测试一下才行。
总结:
通过上面的描述,相信大家也有同样的体会,那就是扩展非常的方便,在实际应用中,客户所要求打印的数据不会发生很大变化,而对这些数据进行的汇总、列表却有着复杂的要求,通过webservice的方式,我们把这种变化集中在服务器端,尽量减少了客户端程序的改动,服务器端完全可以采用更强大的第三方组件来实现绘图功能;对于多页打印的应用,由于wse支持多个附件的好处,我们既可以采用一次性发送所有数据在服务器端生成对应的多个图表返回,也可以分批发送;由于采用了xml的介质,数据的采集也实现了多样化,您完全可以在a服务器上采集数据,在b服务器上实现打印。
对于文中所涉及到的代码,有需要的朋友可来信跟我索取(wohuosile@hotmail.com),对于文中所涉及到的问题,欢迎大家到计算机世界开发者俱乐部(http://www.dev-club.com)进行探讨。
参考资料:
文章标题:了解 dime 和 ws-attachments
地址:http://www.microsoft.com/china/msdn/library/dnwebsrv/html/dimewsattch.asp
文章标题:using web services enhancements to send soap messages with attachments
地址:
http://msdn.microsoft.com/webservices/building/wse/default.aspx?pull=/library/en-us/dnwebsrv/html/wsedime.asp
工具:
采用本文所提供的解决方案,需要下载微软的web services enhancements for microsoft .net 1.0(wse)
下载地址:http://msdn.microsoft.com/webservices/building/wse/default.aspx