zoukankan      html  css  js  c++  java
  • C# WebService调用及数据并行处理

            最近有个项目,涉及到客户自有的系统及公司开发的系统,两个系统数据存在不一致的情况,需要数据同步。客户自有的系统提供资源信息服务接口,公司部署的系统调用该接口将数据同步过来。

            客户给的是webservice接口,调用了一下,调用一次大概是2秒的样子,如果算上解析记录,差不多要2.4秒。由于数据量比较大,自然想到了并行处理。在.net framework4.0 中,提供了便捷的并行处理,不用自己再写线程了。

            周五同事写了部分程序,webservice的请求总是发不出去,由于当时还在处理其他的项目,没认真看他写的代码。今天重新整理下,写了个大体框架,只需将获取的数据同步到数据库,即可。代码如下:

    View Code
    /// <summary>
    /// 同步数据对象。用于从webservice中获取数据后同步
    /// </summary>
    public class WebServiceClient{
           
    private const string WEBSERVICE_URL = "http://host/axis2/services/BookBeanServer";

           
    public static string LastError = string.Empty;

           
    public WebServiceClient() { }

           
    /// <summary>
           
    /// 处理单本资源。为调用处使用并行处理,此处只处理单本资源。
            
    /// </summary>
          
    /// <param name="metaId"></param>
          
    /// <returns></returns>
           public bool Process(string metaId) {
                    var result 
    = new Book();
                    
    try {
                        result.InitializeFrom(
    this.GetBookOrignalXmlFromWebService(metaId));
                    }
                    
    catch (XmlException ex) {
                        LastError 
    = ex.Message;
                        
    return false;
                    }

                    
    return this.SynData(result);
                }

           
    private string GetBookOrignalXmlFromWebService(string metaId) {
                    MyWebServiceReference.BookBeanServerPortTypeClient client 
    = new MyWebServiceReference.BookBeanServerPortTypeClient(
                        
    new WSHttpBinding(SecurityMode.None), 
                        
    new EndpointAddress(WEBSERVICE_URL)
                        );
                    
    object obj = client.getBook(new string[] { metaId });

                    XmlNode[] nodes 
    = (XmlNode[])obj;
                    
    return nodes.Length > 0 ? nodes[0].InnerXml : string.Empty;
         }


         
    private bool SynData(Book Book) {
                
    //TODO:同步数据
                  return true;
         }
                
    }

          WebServiceClient表示单本资源处理类,其职责是调用WebService,将获取的数据同步到数据库。

           由于涉及到的数据量比较大,在调用出使用并行处理。.Net framework4.0中,提供了并行处理方案,在并行处理方面,更推荐使用其提供的Parallel类,与ThreadPool相比,减少了线程开销。

           调用处代码如下:

     1 Parallel.ForEach<string>(
     2                 GetMetaIds(), 
     3                 metaid => { 
     4                     WebServiceClient client = new WebServiceClient();
     5                     var temp = Task.Factory.StartNew(() => { return client.Process(metaid); });
     6                     temp.ContinueWith(tmp => { 
     7                         //TODO:处理同步处理的结果
     8                         Console.WriteLine(tmp.Result ? "ok" : "f"); 
     9                     });
    10                 }
    11           );

          其中GetMetaIds()函数返回IList<string>数据,存储调用的WebService的参数集合。
          在Visual Studio中,在新建的项目中添加web service引用,会自动生成访问代理类。此处为webservice引用创建了MyWebServiceReference的命名空间。
          网上关于C# WebService的文章很多,搜索出来的多是用C#写的Producer和Consumer做为演示,与单独写Consumer还是有区别的。与Consumer在同一个solution中的Producer,添加WebService引用到Consumer工程后,能通过代理直接访问到,但是,如果添加另外的Consumer,生成的代理如果直接调用会让人有些迷惑,不知道怎么调用。

     

  • 相关阅读:
    腾讯TBS加载网页无法自适应记录
    filter过滤器实现验证跳转_返回验证结果
    Oracle不连续的值,如何实现查找上一条、下一条
    springmvc.xml 中 <url-pattern></url-pattern>节点详解
    spring拦截器-过滤器的区别
    (转)spring中的拦截器(HandlerInterceptor+MethodInterceptor)
    @Value("${xxxx}")注解的配置及使用
    mybatis BindingException: Invalid bound statement (not found)
    spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)
    Spring事务管理详解_基本原理_事务管理方式
  • 原文地址:https://www.cnblogs.com/huankfy/p/2011743.html
Copyright © 2011-2022 走看看