• 封装WCF客户端调用


    在之前的博客中,我记录过如何利用SvcUtil.exe工具生成客户端的代理文件,然后调用的情形。

    今天我要讲解的是利用代码直接对服务端进行调用。好处在于,一是不会生成那么大的引用文件,其次是可以方便控制。首先感谢本文:分享基于EF+WCF的通用三层架构及解析提供的源代码。

    首先服务器端的我就不用写了,这里我贴出OperationContract的内容:

       1:  public Book GetBook(int bookID)
       2:   {
       3:        return new Book
       4:        {
       5:                  BookID = 1,
       6:                  BookAuthor = "石朝阳",
       7:                  BookName = "企业架构模式",
       8:                  BookPrice = 85.2M,
       9:                  BookPublishment = "清华大学出版社"
      10:        };
      11:   }

    服务器端的代码没什么特别的。

    下面是客户端的调用代码:

    首先,声明一个IServiceFactory接口,这个接口中有CreateService方法:

       1:     public interface IServiceFactory
       2:      {
       3:          IBookService CreateService();
       4:      }

    然后声明一个RemoteServiceFactory类,这个类中提供创建客户端引用的实例:

       1:  public class RemoteServiceFactory:IServiceFactory
       2:      {
       3:          private readonly string serviceUri = "http://localhost:12665/BookService.svc";
       4:   
       5:          public IBookService CreateService()
       6:          {
       7:              return this.CreateService<IBookService>(serviceUri);
       8:          }
       9:   
      10:          private const int maxReceivedMessageSize = 2147483647;
      11:   
      12:          private T CreateService<T>(string uri)
      13:          {
      14:              var key = string.Format("{0} - {1}",typeof(T),uri);
      15:              var binding = new BasicHttpBinding();
      16:              binding.MaxReceivedMessageSize = maxReceivedMessageSize;
      17:              binding.ReaderQuotas = new XmlDictionaryReaderQuotas();
      18:              binding.ReaderQuotas.MaxStringContentLength = maxReceivedMessageSize;
      19:              binding.ReaderQuotas.MaxArrayLength = maxReceivedMessageSize;
      20:              binding.ReaderQuotas.MaxBytesPerRead = maxReceivedMessageSize;
      21:   
      22:              ChannelFactory<T> chan = new ChannelFactory<T>(binding,new EndpointAddress(uri));
      23:              foreach (var operation in chan.Endpoint.Contract.Operations)
      24:              {
      25:                  var dataContractBehavior = operation.Behaviors.Find<DataContractSerializerOperationBehavior>() 
      26:                      as DataContractSerializerOperationBehavior;
      27:                  if (dataContractBehavior != null)
      28:                      dataContractBehavior.MaxItemsInObjectGraph = int.MaxValue;
      29:              }
      30:              chan.Open();
      31:   
      32:              var service = chan.CreateChannel();
      33:              return service;
      34:          }
      35:      }

    最后在程序中调用即可:

       1:   
       2:          static void Main(string[] args)
       3:          {
       4:              Program program = new Program();
       5:              Book book = program.Service.GetBook(2);
       6:              Console.WriteLine("Book ID:"+book.BookID.ToString());
       7:              Console.WriteLine("Book Name:" + book.BookName.ToString());
       8:              Console.WriteLine("Book Author:" + book.BookAuthor.ToString());
       9:              Console.WriteLine("Book Publishment:" + book.BookPublishment.ToString());
      10:              Console.WriteLine("Book Price:" + book.BookPrice.ToString());
      11:   
      12:              Console.ReadKey();
      13:          }
      14:   
      15:          public IServiceFactory ServiceFactory
      16:          {
      17:              get
      18:              {
      19:                  //Need to inject dynamic later
      20:                  return new RemoteServiceFactory();
      21:              }
      22:          }
      23:   
      24:          public IBookService Service
      25:          {
      26:              get
      27:              {
      28:                  return this.ServiceFactory.CreateService();
      29:              }
      30:          }

    得到的结果如下:

    QQ截图20140303141230

  • 相关阅读:
    B树与B+详解
    处理器拦截器(HandlerInterceptor)详解(转)
    过滤器(Filter)与拦截器(Interceptor )区别
    Redis和MemCache静态Map做缓存区别
    Ubuntu16.10下mysql5.7的安装及远程访问配置
    windows中mysql5.7保存emoji表情
    基于Quartz.NET 实现可中断的任务(转)
    Ubuntu16.10下使用VSCode开发.netcore
    ubuntu16.10 安装ibus中文输入法
    ubuntu 中安装mysql 使用默认用户密码登录
  • 原文地址:https://www.cnblogs.com/scy251147/p/3578266.html
Copyright © 2020-2023  润新知