ASP.NETWebServices与数据绑定技术详解
立即解锁
发布时间: 2025-08-26 01:40:54 阅读量: 4 订阅数: 18 

### ASP.NET Web Services 与数据绑定技术详解
#### 1. 双工服务概述
双工服务适用于小规模应用。如果应用的受众规模小且明确,双工服务是处理定期更新或耗时操作的有效技术。客户端提交作业请求,服务器异步完成工作,再将结果返回给客户端。
#### 2. 配置双工服务
创建双工服务的步骤与普通 Web 服务类似,先向项目中添加支持 Silverlight 的 WCF 服务,这里服务名为 `AsyncTask.svc`。
添加新 Web 服务时,Visual Studio 会添加以下内容:
- `.svc` 文件:服务的端点,客户端将所有消息发送到此 URL,此例中为 `AsyncTask.svc`,无需修改。
- Web 服务代码:对双工服务帮助不大,后续会替换为更合适的版本。
- `web.config` 设置:部分正确,但需调整以支持双工通信,这是首要任务。
将普通 Web 服务转换为双工服务,需对 `web.config` 文件的自动生成设置进行如下更改:
1. 添加对 `System.ServiceModel.PollingDuplex.dll` 程序集的引用,该程序集提供双工支持,可在 `c:\Program Files (x86)\Microsoft SDKs\Silverlight\v5.0\Libraries\Server` 文件夹中找到。
2. 在 `<system.serviceModel>` 元素内添加以下内容:
```xml
<extensions>
<bindingExtensions>
<add name="pollingDuplexHttpBinding" type=
"System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement,
System.ServiceModel.PollingDuplex, Version=5.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"/>
</bindingExtensions>
</extensions>
```
3. 找到 `<bindings>` 部分,移除现有的 `<customBinding>` 元素,添加:
```xml
<pollingDuplexHttpBinding />
```
4. 找到 `<services>` 部分,移除第一个 `<endpoint>` 元素,添加:
```xml
<endpoint address="" binding="pollingDuplexHttpBinding"
contract="IAsyncTaskService"/>
```
需创建 `IAsyncTaskService` 接口,若服务接口名称不同,需相应修改配置信息。
#### 3. 定义接口
客户端与 Web 服务进行双向通信,客户端和服务端需相互了解对方。在编写实际代码前,需创建接口来规范交互。
- **服务接口 `IAsyncTaskService`**:
```csharp
[ServiceContract(CallbackContract = typeof(IAsyncTaskClient))]
public interface IAsyncTaskService
{
[OperationContract(IsOneWay = true)]
void SubmitTask(TaskDescription task);
}
```
- `IsOneWay` 属性设为 `true`,使 `SubmitTask()` 成为单向方法,客户端发送请求后断开连接,无需等待响应,简化服务器端编程模型。
- `CallbackContract` 属性指定客户端使用的接口。
- **客户端接口 `IAsyncTaskClient`**:
```csharp
[ServiceContract]
public interface IAsyncTaskClient
{
[OperationContract(IsOneWay = true)]
void ReturnResult(TaskResult result);
}
```
- **数据类**:
```csharp
[DataContract()]
public class TaskDescription
{
[DataMember()]
public string DataToProcess{ get; set; }
}
[DataContract()]
public class TaskResult
{
[DataMember()]
public string ProcessedData { get; set; }
}
```
#### 4. 实现服务
服务实现 `IAsyncTaskService` 接口,提供 `SubmitTask()` 方法的代码:
```csharp
[AspNetCompatibilityRequirements(RequirementsMode =
AspNetCompatibilityRequirementsMode.Allowed)]
public class AsyncTask : IAsyncTaskService
{
public void SubmitTask(TaskDescription taskDescription)
{
// 模拟耗时工作
Thread.Sleep(TimeSpan.FromSeconds(15));
// 反转字符串
char[] data = taskDescription.DataToProcess.ToCharArray();
Array.Reverse(data);
// 准备响应
TaskResult result = new TaskResult();
result.ProcessedData = new string(data);
// 发送响应给客户端
try
{
IAsyncTaskClient client =
OperationContext.Current.GetCallbackChannel<IAsyncTaskClient>();
client.ReturnResult(result);
}
catch
{
// 无法联系客户端,清理资源
}
}
}
```
服务方法可多次调用 `client.ReturnResult()` 方法,在方法结束前保持与客户端的连接。
#### 5. 客户端代码
客户端代码相对简单:
1. 引用 `System.ServiceModel.PollingDuplex.dll` 程序集的 Silverlight 版本,可在 `c:\Program Files (x86)\Microsoft SDKs\Silverlight\v5.0\Libraries\Client` 文件夹中找到。
2. 创建代理对象时,显式创建双工绑定:
```csharp
private AsyncTaskServiceClient client;
public MainPage()
{
InitializeComponent();
EndpointAddress address = new EndpointAddress("http://localhost:" +
HtmlPage.Document.DocumentUri.Port + "/DuplexService.Web/AsyncTask.svc");
PollingDuplexHttpBinding binding = new PollingDuplexHttpBinding();
client = new AsyncTaskServiceClient(binding, address);
client.ReturnResultReceived += client_ReturnResultReceived;
}
```
3. 处理按钮点击事件:
```csharp
private void cmdSubmit_Click(object sender, RoutedEventArgs e)
{
TaskDescription taskDescription = new TaskDescription()
```
0
0
复制全文
相关推荐








