讨论创建基于WSE的报表打印服务及其实现


目录

  引言

  软件原理

  程序实现

  注意事项

  总结

  引言:

  WSE提供了一个非常方便的功能,就是支持附件的传输,尽管我们可以采用别的方式来达到这个目的,比如直接的返回byte型的数据,但是对于大多数应用而言,直接返回一个附件,如一张图片更为实在些,请大家不要误会我文章的标题,以为创建一个WEBSERVICE就可以方便地实现了打印了,我们的软件原理和最终打印的方式跟卢彦先生里提到的并无多大区别,我们只是利用了WebService的强大的穿透性,来使这个方式更为灵活,更易于应用和拓展,本文所采用的代码全部用C#编写。

  软件原理:

  本文采用了XML形式的数据,客户端将需要打印的数据和一些基本的参数,如图象大小,图象形式等传送给服务器端,而服务器端则根据客户端的要求生成特定的一张或多张图片返回给客户端,由客户端的打印程序统一处理,看了这个逻辑我们就可以发现:所有的业务规则完全在服务器端运做,而客户端只需要少量的代码就可以实现报表的打印。这样就避免了各种升级所带来的烦恼,当实际运用中要求增加一种或多种图表的时候,我们所需要做的只是增加或者修改服务器端的业务规则,而客户所要做的只是告诉我们要打印这种图表就可以了。

  本文采用了一些简单的XML数据,仅供示范用,客户端的Demo数据如下:

<?xml version="1.0" encoding="utf-8"?>
  <Root PrintType="line" Width="450" Height="500" Title="Print Demo">
    <Child Text="1" Value="100" Color="Black">
    </Child>
    <Child Text="2" Value="60" Color="Orange">
    </Child>
    <Child Text="3" Value="30" Color="Red">
    </Child>
    <Child Text="4" Value="40" Color="Gray">
    </Child>
    <Child Text="5" Value="90" Color="Blue">
    </Child>
    <Child Text="6" Value="60" Color="Green">
    </Child>
</Root>
其中PrintType就是客户端要求的打印类型。

  程序实现:

  服务器端代码

  本系统也同样采用了Abstract Factory的设计模式,以利于服务器端方便的扩展,此处就不再赘述。

  新建一个Web服务项目,添加抽象基类,实现类,解析类,建成后的界面如下所示:

  需要加入对Microsoft.Web.Services命名空间的引用

 

  其中

  PrintBase.cs是基类

  Parser.cs是解析类

  LinePrint.cs是实现具体图象的类

  基类代码:

  public class PrintBase
  {
    public PrintBase()
    {
      //
      // TODO: 在此处添加构造函数逻辑
      //
    }
    public virtual Stream DrawImage()
    {
      return null;
    }
}

  解析类代码:

public class Parser
  {
    public Parser()
    {
      //
      // TODO: 在此处添加构造函数逻辑
      //
    }
    public static PrintBase CreateElement(DataSet ds)
    {
      PrintBase pb = null;
      string l_strPrintType = ds.Tables["Root"].Rows[0]["PrintType"].ToString();
      switch(l_strPrintType)
      {
        case "line":
          p