.Net Web服务加密解密数据集

时间:2009-02-07 23:06:08

标签: encryption service dataset

有没有人知道如何在客户端加密数据集并将其发送到Web服务并在那里解密的示例?

另一个问题: 我需要做的是从客户端向Web服务发送数百行数据,并让Web服务使用这些记录更新数据库。如果不使用数据集,我无法想到任何其他方法。有更好的方法吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

就加密而言,为什么要尝试重新发明轮子?只需通过SSL连接到Web服务 - 它最有可能比本土替代品更安全。

我可能会创建一个自定义结构/对象,并将这些数组发送到Web服务而不是DataSet。这将意味着(略微)减少网络流量;它将使webservice的WSDL更具描述性;如果将来有必要,它将使任何非Microsoft应用程序更容易与Web服务进行通信。

编辑:一个例子......

在服务器端,您可以声明自定义类型(例如, ExampleUser ),然后设置您的方法以接受该类型的数组而不是DataSet:

[WebService(Namespace="http://example.yourdomain.com/ExampleWebService/")]
public class ExampleWebService : System.Web.Services.WebService
{
    // this is your custom type
    public class ExampleUser
    {
        public int UserID { get; set; }
        public string Name { get; set; }
        public DateTime DateOfBirth { get; set; }
    }

    // this is your method
    // accepts an array of ExampleUser rather than a DataSet
    [WebMethod]
    public void UploadUsers(ExampleUser[] usersArray)
    {
        // do something...
    }
}

在客户端应用程序中,您将添加对Web服务的引用。这将使您能够使用上面服务器端代码中声明的ExampleUser类型。

然后,您可以将DataSet转换为ExampleUser对象的数组,然后再将其发送到Web服务:

// get the number of rows in the DataTable
int rowCount = yourDataSet.Tables[0].Rows.Count;

// create an array of ExampleUser with the correct capacity
ExampleWebService.ExampleUser[] usersArray =
    new ExampleWebService.ExampleUser[rowCount];

// iterate through each row in the table
for (int i = 0; i < rowCount; i++)
{
    DataRow dr = yourDataSet.Tables[0].Rows[i];

    // create an ExampleUser object and populate it from the DataRow columns
    ExampleWebService.ExampleUser eu = new ExampleWebService.ExampleUser();
    eu.UserID = (int)dr["User_ID"];
    eu.Name = (string)dr["Name"];
    eu.DateOfBirth = (DateTime)dr["Date_Of_Birth"];

    // add the ExampleUser object to the array
    usersArray[i] = eu;
}

// the array is populated so let's call the webservice
ExampleWebService.UploadUsers(usersArray);

编辑:另一个例子......

如果您使用的是.NET 3.5,那么通过使用LINQ和对象初始化程序创建数组,您可以将客户端简化为几行代码:

// create and populate the array
ExampleWebService.ExampleUser[] usersArray =
    yourDataSet.Tables[0].AsEnumerable().Select
    (
        s => new ExampleWebService.ExampleUser()
        {
            UserID = (int)s["User_ID"],
            Name = (string)s["Name"],
            DateOfBirth = (DateTime)s["Date_Of_Birth"]
        }
    ).ToArray();

// the array is populated so let's call the webservice
ExampleWebService.UploadUsers(usersArray);

答案 1 :(得分:0)

嗯,有很多方法可以解决这个问题。由于您是通过线路发送的,您可以:1)将数据写入XML流(这是DataSet的意图)2)您可以压缩XML(压缩率最好是然后3)使用其中一个.NET加密方案进行加密,最后4)将XML解密,解压缩和反序列化为DataSet对象或任何你想用它做的事情。

注意,您可能需要Base64加密的结果。另一种方法是不加密和使用SSL上的Web服务,只使用本机加密。根据数据类型,DataSet可能不是性能方面的最佳选择。您可以发送CSV或JSON样式数据块;这可能会更小,特别是如果DataSet中只有一个“DataTable”对象。就最佳方法的用途而言,很多情况都依赖于情况。