C#WebService调⽤及数据并⾏处理
最近有个项⽬,涉及到客户⾃有的系统及公司开发的系统,两个系统数据存在不⼀致的情况,需要数据同步。客户⾃有的系统提供资源信息服务接⼝,公司部署的系统调⽤该接⼝将数据同步过来。
客户给的是webservice接⼝,调⽤了⼀下,调⽤⼀次⼤概是2秒的样⼦,如果算上解析记录,差不多要2.4秒。由于数据量⽐较⼤,⾃然想到了并⾏处理。在 framework4.0 中,提供了便捷的并⾏处理,不⽤⾃⼰再写线程了。
周五同事写了部分程序,webservice的请求总是发不出去,由于当时还在处理其他的项⽬,没认真看他写的代码。今天重新整理下,写了个⼤体框架,只需将获取的数据同步到数据库,即可。代码如下:
View Code
///<summary>
///同步数据对象。⽤于从webservice中获取数据后同步
///</summary>
调用webservice服务public class WebServiceClient{
private const string WEBSERVICE_URL = "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 = Book(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,⽣成的代理如果直接调⽤会让⼈有些迷惑,不知道怎么调⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。