在WCF应用程序中,如何才能正确的实现WCF异步服务这一操作技巧呢?今天我们将会在这篇文章中为大家详细介绍一下有关这方面的具体应用方式,希望对于又需要的朋友们可以从中获得一些帮助。
本例子中,我们通过服务调用来读取服务端的文件,在实现文件读取操作的时候,采用异步文件读取方式。
先来看看服务契约的定义。服务契约通过接口IFileReader定义,基于文件名的文件读取操作以异步的方式定义在BeginRead和EndRead方法中。
- using System;
- using System.ServiceModel;
- namespace Artech.AsyncServices.Contracts
- {
- [ServiceContract(Namespace="http://www.artech.com/")]
- public interface IFileReader
- {
- [OperationContract(AsyncPattern = true)]
- IAsyncResult BeginRead(string fileName, AsyncCallback
userCallback, object stateObject);- string EndRead(IAsyncResult asynResult);
- }
- }
FileReader实现了契约契约,在BeginRead方法中,根据文件名称创建FileStream对象,调用FileStream的BeginRead方法实现文件的异步读取,并直接返回该方法的执行结果:一个IAsyncResult对象。在EndRead方法中,调用FileStream的EndRead读取文件内容,并关闭FileStream对象。
- using System;
- using System.Text;
- using Artech.AsyncServices.Contracts;
- using System.IO;
- namespace Artech.AsyncServices.Services
- {
- public class FileReaderService : IFileReader
- {
- private const string baseLocation = @"E:\";
- private FileStream _stream;
- private byte[] _buffer;
- #region IFileReader Members
- public IAsyncResult BeginRead(string fileName, AsyncCallback
userCallback, object stateObject)- {
- this._stream = new FileStream(baseLocation + fileName,
FileMode.Open, FileAccess.Read, FileShare.Read);- this._buffer = new byte[this._stream.Length];
- return this._stream.BeginRead(this._buffer, 0, this._buffer.Length,
userCallback, stateObject);- }
- public string EndRead(IAsyncResult ar)
- {
- this._stream.EndRead(ar);
- this._stream.Close();
- return Encoding.ASCII.GetString(this._buffer);
- }
- #endregion 30: }
- }
采用传统的方式寄宿该服务,并发布元数据。在客户端通过添加服务引用的方式生成相关的服务代理代码和配置。你将会发现客户端生成的服务契约和服务代理类中,会有一个***的操作Read。也就是说,不管服务采用同步模式还是WCF异步服务实现,对客户端的服务调用方式没有任何影响,客户端可以任意选择相应的模式进行服务调用。
- namespace Clients.ServiceReferences
- {
- [ServiceContractAttribute(ConfigurationName=
"ServiceReferences.IFileReader")]- public interface IFileReader
- {
- [OperationContractAttribute(Action =
" http://www.artech.com/IFileReader/Read",
ReplyAction = " http://www.artech.com/IFileReader/
ReadResponse")]- string Read(string fileName);
- }
- public partial class FileReaderClient :
ClientBase<IFileReader>, IFileReader- {
- public string Read(string fileName)
- {
- return base.Channel.Read(fileName);
- }
- }
- }
直接借助于生成的服务代理类FileReaderClient,服务调用的代码就显得很简单了。
- using System;
- using Clients.ServiceReferences;
- namespace Clients
- {
- class Program
- {
- static void Main(string[] args)
- {
- using (FileReaderClient proxy = new FileReaderClient())
- {
- Console.WriteLine(proxy.Read("test.txt"));
- }
- Console.Read();
- }
- }
- }
以上就是对WCF异步服务的实现做的详细介绍。
【编辑推荐】