在Visual Studio LightSwitch中调用 Web Service以验证数据

[原文发表地址]  Calling Web Services to Validate Data in Visual Studio LightSwitch

[原文发表时间] 2012-01-30 6:15 AM

很多时候在商务应用程序中,我们需要通过另一个服务验证数据。我不是在说验证输入的数据的格式 — — 这在LightSwitch中是很容易做到的— — 我说的是验证数据的意思。例如,你可能不仅需要验证 (LightSwitch 会为你自动处理) 电子邮件地址的格式,而且也要验证电子邮件地址是否是真实的。另一个常见的例子是物理地址验证,这可以确保在你将包裹发送给它之前,邮政地址是真实的。

在这篇文章中,我将向你们展示当验证LightSwitch 数据时,如何调用web服务。我将使用地址簿示例,并实现一个地址验证器,而这个验证器调用了一项验证数据的服务。

我们在哪儿调用服务?

Visual Studio LightSwitch中有几个地方,你可以在其中放置代码来验证实体。包括了Property_Validate方法和Entity_Validate方法。Property_Validate 方法首先在客户端上运行,然后在服务器上运行,这样有利于检查输入数据的格式,与其他任何属性做比较,或根据相关实体中的条件来操作数据。通常,你希望在这里放验证代码,那样用户可以在数据提交到服务器之前,立即获得任何错误信息的反馈。这些方法都包含在实体类本身中。(详细信息请参阅 LightSwitch 验证框架: LightSwitch 应用程序中数据验证概述)

Entity _Validate 方法仅在服务器上运行,包含在 ApplicationDataService 类中。这是调用外部验证服务的最佳位置,因为它避免了客户端直接调用外部服务——相反的,外部服务是由LightSwitch 中间层调用的。这使你更好地控制你的网络通信。客户端应用程序可能只允许内部连接到你的内网,但你可以允许外部通信到服务器,并在一个地方管理外部连接。

调用 Web 服务

外部有验证数据的各种服务,每个服务都有一组不同的要求。通常我更偏向于Rest-ful服务,那样你可以进行简单的 http 请求 (GET) ,并获取一些数据。但是,你还可以添加像 ASMX 和 WCF 服务的服务引用。这取决于你使用的服务,所以你需要参阅其特定文档。

要添加服务引用到 LightSwitch 的应用程序中,首先切换到解决方案资源管理器中的文件视图,右键单击该服务器项目,然后选择添加服务引用…

image

输入服务的URL,这将为你生成服务的代理类。然后,你可以从服务器代码中调用它们,这些代码是你在 ApplicationDataService 中所编写的代码,就像你会在任何有一个服务引用的应用程序中所编写的那样。在调用REST-ful服务,并返回XML feed的情况下,你可以简单地构建URL 来调用并检查结果。让我们来看看如何做到这一点。

地址簿示例

此示例中,我们有一个名为地址的表,当保存数据时,我们想要在其中验证物理地址。我可以找到几个地址验证服务以供选择,但对于此示例,我选择注册一个来自 ServiceObjects且免费试用的地址验证服务。他们有一些很好的、简单的API,并支持REST web 请求。一旦你注册了,他们会给你一个许可证密钥,你需要将其传递到服务中。

示例请求如下所示:

<https://trial.serviceobjects.com/av/AddressValidate.asmx/ValidateAddress?Address=One+Microsoft+Way&Address2=&City=Redmond&State=WA&PostalCode=98052&LicenseKey=12345>

这将返回结果:

<?xml version="1.0" encoding="UTF-8"?>

<Address xmlns="https://www.serviceobjects.com/"

xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="https://www.w3.org/2001/XMLSchema">

<Address>1 Microsoft Way</Address>

<City>Redmond</City>

<State>WA</State>

<Zip>98052-8300</Zip>

<Address2/>

<BarcodeDigits>980528300997</BarcodeDigits>

<CarrierRoute>C012</CarrierRoute>

<CongressCode>08</CongressCode>

<CountyCode>033</CountyCode>

<CountyName>King</CountyName>

<Fragment/>

</Address>

如果你输入一个假的地址或忘记指定城市 + 州或邮政编码,那么你会得到一个错误的结果:

<?xml version="1.0" encoding="UTF-8"?>

<Address xmlns="https://www.serviceobjects.com/"

xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="https://www.w3.org/2001/XMLSchema">

<Error>

<Desc>Please input either zip code or both city and state.</Desc>

<Number>2</Number>

<Location/>

</Error>

</Address>

因此为了与该服务进行交互,我们首先需要向服务器项目中添加一些程序集引用。右键单击该服务器项目 (如上所示) 并选择"添加引用",导入 System.Web 和 System.Xml.Linq。

image

下一步,切到逻辑视图,并在数据设计器中打开地址实体。下拉编写代码按钮来访问 Addresses_Validate 方法。(如果在文件视图中,你也可以直接打开 Server\UserCode\ApplicationDataService 代码文件)。

image

首先,我们需要引入一些命名空间,以及在响应中所返回的默认XML 命名空间。(关于 Visual Basic 中XML 的详细信息,请参阅: Visual Basic 中LINQ 到XML 的概述,以及我的博客上的文章。)然后我们可以构造基于地址实体属性的 URL,查询结果 XML 上的错误或更正地址。如果我们发现一个错误,我们会让LightSwitch在屏幕上向用户显示验证结果。

    1: Imports System.Xml.Linq
    2: Imports System.Web.HttpUtility
    3: Imports <xmlns="https://www.serviceobjects.com/">
    4:  
    5: Namespace LightSwitchApplication
    6:   Public Class ApplicationDataService
    7:  
    8:     Private Sub Addresses_Validate(entity As Address, results As EntitySetValidationResultsBuilder)
    9:       Dim isValid = False
   10:       Dim errorDesc = ""
   11:  
   12:       'Construct the URL to call the web service
   13:       Dim url = String.Format("https://trial.serviceobjects.com/av/AddressValidate.asmx/ValidateAddress?" &
   14:                               "Address={0}&Address2={1}&City={2}&State={3}&PostalCode={4}&LicenseKey={5}",
   15:                               UrlEncode(entity.Address1),
   16:                               UrlEncode(entity.Address2),
   17:                               UrlEncode(entity.City),
   18:                               UrlEncode(entity.State),
   19:                               UrlEncode(entity.ZIP),
   20:                               "12345")
   21:  
   22:       Try
   23:           'Call the service and load the XML result           Dim addressData = XElement.Load(url)
   24:  
   25:           'Check for errors first
   26:           Dim err = addressData...<Error>
   27:           If err.Any Then
   28:               errorDesc = err.<Desc>.Value
   29:           Else
   30:               'Fill in corrected address values returned from service
   31:  
   32:               entity.Address1 = addressData.<Address>.Value
   33:               entity.Address2 = addressData.<Address2>.Value
   34:               entity.City = addressData.<City>.Value
   35:               entity.State = addressData.<State>.Value
   36:               entity.ZIP = addressData.<Zip>.Value
   37:               isValid = True
   38:           End If
   39:  
   40:       Catch ex As Exception
   41:           Trace.TraceError(ex)
   42:       End Try
   43:  
   44:       If Not (isValid) Then
   45:           results.AddEntityError("This is not a valid US address. " & errorDesc)
   46:       End If
   47:     End Sub
   48:   End Class
   49: End Namespace

运行它

既然我已经实现了此代码,让我们在联系人屏幕上输入一些地址。在这里我输入了三个地址,前两个是合法的,最后一个不是。此外请注意我只指定了部分地址。

image

如果我试图保存此屏幕,从服务的最后一行会返回一个错误。LightSwitch将不允许我们保存直到地址被更正。

image

如果我删除这个假的地址,并再次保存,你将看到其他地址被核实,而且所有的字段都更新了完整的地址信息。

image

总结

我希望这篇文章能指导你如何执行web 服务调用到LightSwitch 验证管道中 。即使你使用的每个服务有不同的要求,如何调用它们和它们返回的结果有所不同,但LightSwitch 验证管道为你提供必要挂钩来轻松地执行复杂的实体验证。

希望大家喜欢 !