WCF異步服務正確創建方式詳解
在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異步服務的實現做的詳細介紹。
【編輯推薦】