65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Pocket PC/PDA 上使用 Web 服务开发无线工作流自动化客户端

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (7投票s)

2006年11月27日

CPOL

5分钟阅读

viewsIcon

50184

downloadIcon

404

本文重点介绍使用 C# 2003 开发 Pocket PC 的工作流客户端设备应用程序。

引言

工作流自动化客户端通常是基于 Web 的,这是一种实现业务流程和在组织内大规模部署工作流客户端的简单方法。这些工作流客户端和流程大多使用 BPM 软件自带的组件(DLL、SDK)开发。这些 DLL(或 .NET 程序集)包含了大部分工作流功能和路由机制。然而,这类工作流自动化客户端并未针对 Pocket PC/Palm 和智能手机等设备进行设计。

在智能手机/Pocket PC 上访问这类大型网站并不理想,防火墙安全也可能阻止用户访问网站。对于 Pocket PC,我们将开发一个基于设备的应用程序,该应用程序将向 Web 服务查询,然后 Web 服务将实现各种业务规则,并实现 .NET 程序集或 DLL 的方法和属性。该 Web 服务通过 HTTP 协议上的 XML 接口/SOAP 将结果返回给设备应用程序。也就是说,Pocket PC 应用程序获取数据并将其显示给用户。同样,用户可以提交一个任务来更新数据库状态,而在组织/公司工作的另一位用户可以使用普通的台式 PC 在基于 Web 的工作流客户端上查看它。

我们将首先开发一个 Web 服务,该服务包含连接数据库的逻辑并从中进行查询。

注意:我使用了示例数据库。请记住,包含工作流跟踪 ID 的数据库应该是随工作流 BPM 软件附带的工作流数据库。将所有使用工作流数据库的数据访问代码封装在 API 中也是一个好习惯。如果 API 作为 SDK 随工作流软件提供,最好使用它们。

步骤 1

转到 VS 2003 -> 新建项目 -> Visual C# 项目。选择 ASP.NET Web 服务模板。在“位置”字段中,指定项目名称。

Sample screenshot

向项目中添加两个新类。将它们命名为 DatabaseCS.csDataAccess.cs

DatabaseCS.cs 将定义以下函数

public short OpenConnection(string strServername, string struser, 
                            string strpwd , string strDatabase)

它从 Web 方法接收数据库名称、服务器名称等参数。

DataAccess.cs 将具有重载的 Execute_Dataset 函数

public short Execute_Dataset(DatabaseCS DBcs,string StrQueryl)
//overloaded function

它接收 DatabaseCS 类中的活动打开连接对象、Web 方法(ASMX 文件)中的查询字符串,然后查询数据库并填充 DataSet

第二步

Web 方法

为了在 Web 方法中使用这些函数,我们在 .asmx 文件中编写代码如下:

[WebMethod]
public DataSet Select(string strQuery,ArrayList DBParm)
{
    strServername= DBParm[0].ToString();
    struser= DBParm[1].ToString();
    strpwd= DBParm[2].ToString();
    strDatabase= DBParm[3].ToString();
    DataSet dsselect=new DataSet();

    DatabaseCS DBcs=new DatabaseCS();
    dsselect.Clear();
    short iretval=0;
    iretval=DBcs.OpenConnection( strServername, 
                struser, strpwd , strDatabase);

    if(iretval> 0)
    {
        DataAccess DBAccess=new DataAccess(strQuery);
        short ierror= DBAccess.Execute_Dataset(DBcs,strQuery);
        dsselect=DBAccess.GetDataeset();
    }

    DBcs.CloseConnection();
    return dsselect;

}

DBParam 是一个 ArrayList,其中包含数据库名称、服务器名称、用户 ID 和密码。

步骤 3

生成项目。在 Internet Explorer 中访问 Web 服务。

是的,我们可以看到我们的 Web 方法。

步骤 4

下一步是为 Pocket PC 开发一个客户端应用程序,该应用程序将访问这些 Web 服务方法。

启动新建项目 -> Visual C# 项目 -> Smart Device Application。在“名称”字段中输入 Wirelessworkflowclient。在“位置”字段中选择驱动器/文件夹。

Sample screenshot

步骤 5

在 Smart Device 应用程序向导中,从标记为“您要定位哪个平台?”的列表中选择 Pocket PC,并从标记为“您要创建什么项目类型?”的列表中选择 Windows 应用程序

Sample screenshot

点击/按确定。

在主窗体上添加一个 MainMenu、一个 InputPanel 和一个 ContextMenu。现在将一个 DataGrid 控件拖到主窗体上。

步骤 6

现在我们将向此项目添加 Web 引用。转到解决方案资源管理器,右键单击并选择添加 Web 引用。

Sample screenshot

在“URL”字段中输入 Web 服务的地址,然后单击“转到”。

注意:在此步骤中,请勿为 URL 编写“Localhost”。如果使用 LAN,请使用 IP 地址,或者使用服务器的域名。如果您在模拟器上测试应用程序(这是肯定的),并且您的 PC 在 LAN 上,请使用 IP 地址。如果您的 PC 不在 LAN 上且未连接到 Internet,请使用您 PC 的主机名。但是,在模拟器上启动应用程序之前,请安装 Microsoft Loopback Adapter LAN。有关进一步的配置提示,请参阅本文末尾。

Sample screenshot

在“Web 引用名称”字段中输入 Web 引用的名称。单击“添加引用”。

步骤 7

现在编写代码以访问数据库中的数据并将其显示在 DataGrid 中。我们这里关心两个数据库。因此,一个从 Orders/Products 数据库(例如,假设是 Northwind)提取,另一个当然是您的主要工作流数据库。定义两个数据库的变量和一个 ArrayList,该 ArrayList 包含这些变量以将它们传递给 Web 服务。在 MainScreen()(窗体的构造函数)中初始化 ArrayList。创建 Web 服务的实例。

using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Data;

namespace Wirelessworkflowclient
{

/// <summary>
/// Summary description for Form1.
/// </summary>

public class MainScreen : System.Windows.Forms.Form
{
    //WebReference11.MobMService serv = 
       new WebReference11.MobMService();
    WbService.Wireless serv = 
       new Wirelessworkflowclient.WbService.Wireless();
    string currentlogeduser;

    ArrayList DBParam=new ArrayList(4);
    ArrayList DBParam2=new ArrayList(4);
    string strServername="myserverSQL";
    string struser="sa";
    string strpwd ="";
    string strDatabase="ProcessesDB";
    string strServernameM="myserverSQL"; 
    string struserM="sa";
    string strpwdM ="";
    string strDatabaseM="NORTHWind";

    private System.Windows.Forms.ContextMenu contextMenu1;
    private System.Windows.Forms.Label Name;
    private System.Windows.Forms.Label ID;
    private System.Windows.Forms.DataGrid DGTasks;
    private Microsoft.WindowsCE.Forms.InputPanel inputPanelT;
    private System.Windows.Forms.MainMenu mnuM;
    private System.Windows.Forms.Label HD;

    public MainScreen()
    {
        //
        // Required for Windows Form Designer support
        //

        InitializeComponent();
        //initrilize arraylist with database parms
        DBParam.Add(strServername);
        DBParam.Add(struser );
        DBParam.Add(strpwd);
        DBParam.Add(strDatabase);
        DBParam2.Add(strServernameM);
        DBParam2.Add(struserM );
        DBParam2.Add(strpwdM );
        DBParam2.Add(strDatabaseM );

        //
        // TODO: Add any constructor code after InitializeComponent call
        //
    }

    public void FetchRemoteData(string login)
    {
    
        Cursor.Current =Cursors.WaitCursor;
        string Msg="";
        ID.Text ="User ID:"+login;
        MessageBox.Show(serv.Url);
        //try this to check if your web service 
        //url in reference.cs is updated to right url.

        try
        {
            DataSet dsnew =new DataSet();
            DataSet dsname=new DataSet();
            dsname=serv.Select("select * from Tables1 where name='" + 
                               login.Trim() + "'",DBParam.ToArray());
            if(dsname.Tables.Count>0)
            {
            if(dsname.Tables[0].Rows.Count>0)
            {
            Name.Text =dsname.Tables[0].Rows[0]["Fullname"].ToString();
            }
        }
        else
        {
        }
        try
        {
            string strq="select Northwind..Products.Productname" + 
                        " Product , ProcessesDB..Process.Agenda ," + 
                        "from ProcessesDB ,Northwind..Products " + 
                        "where  ProcessesDB..Process." + 
                        "ActiveLoginClient ='" + login +
                        "' and Northwind..Products.ProductID=incno " + 
                        "order by Northwind..[Products].ProductID desc";
            dsnew = serv.Select(strq ,DBParam2.ToArray());
            if(dsnew.Tables.Count>0)
            {
                if(dsnew.Tables[0].Rows.Count>0)
                {
                    DGTasks.DataSource =dsnew.Tables[0];
                }
                else
                {
                    Msg ="No New data in your workflow client";
                }
            }
            else
            {
                Msg ="Server Unavaialable!";
            }
        }
        catch(Exception ex2)
        {
            MessageBox.Show (ex2.Message);
            Msg =ex2.Message;
            return;
        }
    }
    catch(Exception exx)
    {
        MessageBox.Show ("2" + exx.Message);
        Msg =exx.Message;
    }
    Cursor.Current =Cursors.Default;
}

在“窗体加载”事件中,编写以下代码

FetchRemoteData(currentloggeduser);

注意:您可以使用另一个窗体进行登录和访问授权。在 Web 服务中编写一个方法,该方法接受用户名、密码,并从数据库中验证它们,然后将 true/false 值发送到客户端。

步骤 8

如果您的代码在此处结束,则该是时候构建项目并将其部署到模拟器上了。

从菜单中选择“生成”->“生成解决方案”。

Sample screenshot

在下一步中,从列表中选择“Pocket PC 2002 模拟器”,然后单击“部署”。

Sample screenshot

我们开始吧...

Sample screenshot

Sample screenshot

Loopback Adapter 的配置:控制面板 -> 添加硬件 -> 添加 Microsoft Loopback Adapter。

安装后,在 Microsoft Loopback Adapter 的属性中,选择 TCP/IP,然后输入 IP 地址 192.168.0.1 和子网掩码 255.255.255.0。同样,在模拟器上,选择“网络适配器”->“N2000 以太网驱动程序”。

Sample screenshot

单击“属性”。输入 IP 地址 192.168.0.2 和子网掩码 255.255.255.0。

Sample screenshot

如果从模拟器连接 Web 服务时出现问题,请更改模拟器设置中的模拟器设备 ID。

摘要

我们设计并开发了一个通用的 Web 服务,用于数据库连接和操作。但是,BPM 软件提供附加功能,并提供用于用户访问和其他操作的 DLL。您也可以将该功能嵌入到 Web 服务中。

Pocket PC 设备旨在为授权用户获取所有工作流任务数据。

编程愉快!

© . All rights reserved.