在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 的应用程序中,首先切换到解决方案资源管理器中的文件视图,右键单击该服务器项目,然后选择添加服务引用…
输入服务的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。
下一步,切到逻辑视图,并在数据设计器中打开地址实体。下拉编写代码按钮来访问 Addresses_Validate 方法。(如果在文件视图中,你也可以直接打开 Server\UserCode\ApplicationDataService 代码文件)。
首先,我们需要引入一些命名空间,以及在响应中所返回的默认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
运行它 !
既然我已经实现了此代码,让我们在联系人屏幕上输入一些地址。在这里我输入了三个地址,前两个是合法的,最后一个不是。此外请注意我只指定了部分地址。
如果我试图保存此屏幕,从服务的最后一行会返回一个错误。LightSwitch将不允许我们保存直到地址被更正。
如果我删除这个假的地址,并再次保存,你将看到其他地址被核实,而且所有的字段都更新了完整的地址信息。
总结
我希望这篇文章能指导你如何执行web 服务调用到LightSwitch 验证管道中 。即使你使用的每个服务有不同的要求,如何调用它们和它们返回的结果有所不同,但LightSwitch 验证管道为你提供必要挂钩来轻松地执行复杂的实体验证。
希望大家喜欢 !