ASP.NETWebServices深度解析与实践
立即解锁
发布时间: 2025-08-13 03:16:09 阅读量: 19 订阅数: 36 

### ASP.NET Web Services 深度解析与实践
#### 1. 跨域访问与安全检查
当服务不允许跨域访问时,应尽可能严格控制 Web 方法。这能预防多种问题,比如网站配置变更意外授予跨域访问权限、攻击者获取网站访问权,或攻击者诱使应用执行破坏操作。
在跨域 Web 服务中进行安全检查时,不能信任 Cookie 或非实际请求消息一部分的任何身份验证信息。因为可信用户可能访问恶意应用,恶意应用会获取他们当前的 Cookie。为防止此类问题,可在 Web 服务中添加检查机制,查找不当使用情况,例如短时间内访问过多数据的用户,或试图查看或编辑与自己无关数据的用户。
#### 2. 网络连接监控
在某些场景下,用户可能在计算机未联网时运行应用,此时调用 Web 服务必然失败。处理此问题相对简单,失败的 Web 服务调用会触发完成事件,尝试检索结果时会抛出异常通知问题。
若网络连接存在但网络不稳定,完成事件可能在调用超时后才触发;若计算机完全断开网络连接,完成事件会立即触发。无论哪种情况,都需捕获异常,可选择忽略问题或通知用户。
异常处理代码为应用提供了基本的防御机制。对于间歇性连接的客户端,可利用 Silverlight 的网络监控支持更优雅地处理此问题。网络监控功能由两个简单类组成,都位于 `System.Net.NetworkInformation` 命名空间,且都只公开一个公共成员:
- 可使用 `NetworkInterface` 类的 `GetIsNetworkAvailable()` 方法确定用户是否在线。
- 可响应 `NetworkChange` 类的 `NetworkAddressChanged` 事件,确定网络状态(或 IP 地址)何时改变。
通常按以下顺序操作:先使用 `GetIsNetworkAvailable()` 确定网络状态,再处理 `NetworkAddressChanged` 事件以捕捉任何变化。示例代码如下:
```vb
Public Sub New()
InitializeComponent()
' Watch for network changes.
AddHandler NetworkChange.NetworkAddressChanged, AddressOf NetworkChanged
' Set up the initial user interface
CheckNetworkState()
End Sub
Private Sub NetworkChanged(ByVal sender As Object, ByVal e As EventArgs)
' Adjust the user interface to match the network state.
CheckNetworkState()
End Sub
Private Sub CheckNetworkState()
If NetworkInterface.GetIsNetworkAvailable() Then
' Currently online.
cmdCallCachedService.IsEnabled = True
cmdCallService.IsEnabled = True
Else
' Currently offline.
cmdCallCachedService.IsEnabled = False
cmdCallService.IsEnabled = False
End If
End Sub
```
需注意,网络监控功能旨在帮助构建更完善、响应更灵敏的应用,但不能替代捕获网络异常的异常处理代码。即便存在网络连接,也不能保证能访问互联网、请求的网站在线,以及请求的 Web 服务方法能无错运行。因此,调用 Web 服务时需谨慎。
#### 3. 使用 ASP.NET 平台服务
通常,WCF 服务无法访问 ASP.NET 平台功能,即便 ASP.NET 负责编译和托管服务,服务也不能使用以下功能:
- 会话状态
- 数据缓存
- `web.config` 文件中的授权规则
- 基于提供程序的功能,如身份验证、成员资格和配置文件
在很多情况下,这是合理的,因为 WCF 服务旨在独立于 ASP.NET 平台。使用仅适用于 ASP.NET 的功能存在风险,会限制将服务迁移到其他主机、使用其他传输协议的能力。
不过,在某些场景下,ASP.NET 功能可显著减少工作量。例如,可构建一个服务,若内存缓存可用则使用它;若不可用,服务可优雅降级并从其他源(如数据库)获取信息。若内存缓存正常工作且有所需信息,可节省重新查询或重新创建信息的开销。同样,使用一些基于 ASP.NET 提供程序的功能可轻松实现特定用户身份验证、基于角色的安全和存储,无需从头重新实现类似功能。
要在 Web 服务中访问 ASP.NET 功能,可使用 `System.Web.HttpContext` 类的共享 `Current` 属性。`HttpContext` 表示托管服务的 HTTP 环境,通过其属性可访问关键的 ASP.NET 对象,如 `Session`(每个用户的会话状态)、`Application`(全局应用程序状态)、`Cache`(数据缓存)、`Request`(HTTP 请求消息)、`User`(发出请求的用户)等。
以下示例使用 `HttpContext` 访问数据缓存,缓存 `Product` 对象集合,避免每次调用 Web 服务方法时都查询数据库:
```vb
<OperationContract()> _
Public Function GetAllProducts() As Product()
' Check the cache.
Dim context As HttpContext = HttpContext.Current
If context.Cache("Products") IsNot Nothing Then
' Retrieve it from the cache
Return CType(context.Cache("Products"), Product())
Else
' Retrieve it from the database.
Dim products As Product() = QueryProducts()
' Now store it in the cache for 10 minutes.
context.Cache.Insert("Products", products, Nothing, _
DateTime.Now.AddMinutes(10), TimeSpan.Zero)
Return products
End If
End Function
' This private method contains the database code.
Private Function QueryProducts() As Product()
...
End Function
```
#### 4..NET RIA 服务
Silverlight 领域最热门的开发是 `.NET RIA`(富互联网应用程序)服务。本质上,`.NET RIA` 服务打破了 Silverlight 和 ASP.NET 之间的障碍,使 Silverlight 更易通过 Web 服务利用 ASP.NET 功能。
例如,`.NET RIA
0
0
复制全文


