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

使用 eval() 的灵活 JScript.NET Web 服务

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.78/5 (3投票s)

2007年5月18日

3分钟阅读

viewsIcon

24802

downloadIcon

93

使用 JScript.NET 构建您的 Web 服务意味着您可以跨网络发送业务逻辑代码。本文将向您展示如何实现。

引言

不久前,我参与开发了一个具有独特框架设计的应用程序。它本质上是一个订单管理系统,用户可以创建订单、添加订单详细信息、更改订单详细信息,以及执行您希望一个好的购物车所做的任何操作。该框架本身处理了添加订单、计算订单总额、检查项目是否存在或任何其他关键订单功能的常见业务逻辑。独特之处在于需要允许不同的实现方式在执行这些任务之前或之后执行自己的业务逻辑。有时您可能希望覆盖在数据库中创建的描述,或者在满足某些条件时修改数量。为了完成这些事情,开发人员必须编写一个实现这些调用的 Windows * .dll *。编写这些 * .dll * 既繁琐又容易出错。此外,外部开发人员必须非常熟悉该框架才能深入研究。我们需要一种方法,让开发人员将其业务逻辑代码传递给框架(现在是 Web 服务),该框架将在特定时间执行。

如您所知,您无法真正将业务逻辑传递给 Web 服务。一旦您将其发送出去,您必须等待它返回才能更改和重新发送数据。在阅读了这篇文章之后,我想到使用 Jscript.NET 的 eval 函数来完成外部库会完成的任务。 使用 eval 函数,可以将文本发送到 Web 服务,然后像执行代码一样执行该文本。 因此,我开始编写一个 Jscript.NET Web 服务,该服务将利用动态代码执行的强大功能。

使用代码

考虑以下示例

WebMethodAttribute public function InsertOrderDetail(
    productId : int, quantity : int, 
    onAfterOrderDetailInsert : String) : OrderDetail
{
      var orderDetail : OrderDetail = new OrderDetail(productId, quantity);
      eval(onAfterOrderDetailInsert);
      return orderDetail;           
}

在此 Web 方法中,将创建一个订单,然后执行一些代码,这些代码可以更改数量、描述或您希望对订单执行的任何操作。然后,我更进一步,实际上创建了一个方法来封装此过程

private function OnAfterOrderDetailInsert(
    code : String, Inserted : OrderDetail)
{
      eval(code);
}

由于安全问题,您可能希望限制用户可以在其 eval 中执行的操作。 封装它会稍微抽象它,并强制限制仅更新订单详细信息对象。 此外,由于我没有为安全级别参数指定值,因此 eval 无权访问网络或文件系统。 这绝不解除我们所有的安全问题,代码仍然会弄乱事情。 因此,之前的代码变为

WebMethodAttribute public function InsertOrderDetail(productId : int, 
    quantity : int, onAfterOrderDetailInsert : String) : OrderDetail
{
      var orderDetail : OrderDetail = new OrderDetail(productId, quantity);
      OnAfterOrderDetailInsert(onAfterOrderDetailInsert, orderDetail);
      return orderDetail;
}

要总结此方法并使用 eval,就这么简单

protected void InsertOrderDetail_Click(object sender, EventArgs e)
{
    string onOrderDetailInsert = @"" +
        "if(Inserted.QuantityAvailable < 20)\n" +
        "{\n" +
        "   Inserted.Description += ' ON SALE!!!';\n" +
        "}";

    OrderManagement.OrderService orderService = 
new miscellaneous.JScriptEvalExample.WebSite.OrderManagement.OrderService();
    OrderManagement.OrderDetail orderDetail = 
        orderService.InsertOrderDetail(
        ProductID, Quantity, onOrderDetailInsert);
}

这将根据可用数量修改订单详细信息的描述。

结论

当我们有权访问 Web 服务未公开的变量、属性和方法时,Eval 代码真正派上用场。 假设在插入订单详细信息之前,您需要检查项目的可用性。 以前,您必须调用 Web 服务 2 次:一次获取可用性,另一次添加项目。 使用 eval,您可以保存最后一步。

因此,显而易见的是,如果正确且安全地使用 eval 功能,则确实可以为 Web 服务使用者提供自由。 它可以让他们在指定的时间点渗透到该过程中,并使用 SOAP 调用传输他们自己的业务逻辑。 此外,它可以帮助组合步骤,从而无需多次调用 Web 服务。 我已附加了所有示例代码以及 Jscript.NET Web 服务,并引用了示例网站。

历史

  • 2007 年 5 月 18 日 - 发布原始版本
© . All rights reserved.