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,生成的代理如果直接调用会让人有些迷惑,不知道怎么调用。

     

  • 相关阅读:
    轻重搭配
    EF的优缺点
    使用bootstrap-select有时显示“Nothing selected”
    IIS发布 HTTP 错误 500.21
    js添加的元素无法触发click事件
    sql server查看表是否死锁
    sql server把一个库表的某个字段更新到另一张表的相同字段
    SQLSERVER排查CPU占用高的情况
    SQL server中如何按照某一字段中的分割符将记录拆成多条
    LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.
  • 原文地址:https://www.cnblogs.com/huankfy/p/2011743.html
Copyright © 2011-2022 走看看