码迷,mamicode.com
首页 > Web开发 > 详细

用.net访问电子枢纽信用中心的数据查询服务

时间:2016-12-02 22:52:48      阅读:476      评论:0      收藏:0      [点我收藏+]

标签:解决方案   style   uri   height   public   规律   private   实例化   html   

概要说明

电子枢纽全称国家交通运输物流公共信息平台,主要提供物流及生产企业进行物流相关数据交换的标准和API,详细介绍可参考其官网www.logink.org,本文假定阅读者对该平台已有了解,并已成功申请了相应的帐号和数据交换服务。

信用中心是电子枢纽众多数据服务中的一个,提供物流参与者信用信息的上传和查询,包括运输车辆、从业人员等。官方的示例和介绍大多以Java为主,.net的非常少,希望本文可以帮助.net开发人员快速掌握数据交换方式。

电子枢纽的数据服务分为两种,一种称为数据交换,另一种称为服务调用。

数据交换是一种类似电子邮件的行为,可以把电子枢纽看作是一个邮件服务器,发送和接收数据就与收发电子邮件的方式类同。

服务调用就是常规的HTTP请求,主要用于向电子枢纽查询信息,例如对于信用中心来说,可以查询到车辆的运政信息、诚信记录等。

本文主要介绍的是服务调用方式,要调用电子枢纽提供的服务,首先必须确保已经开通了相关服务,开通后还需要获得服务的ID,这些任务都可以从电子枢纽的用户管理中心完成。

在调用服务前,必须获得用户验证的令牌(Access Token),这项工作可通过统一认证服务完成,获得令牌后,方可凭令牌调用相关服务。

引入服务

电子枢纽的数据接口都是以Web Service提供的,所以在开始编码之前,可以先引入相关的服务,在VS里直接添加服务引用即可,相关的服务地址可以在官网的开放接入中心找到。

值得注意的是,虽然电子枢纽提供的大部分Web Service都可以在VS中直接引入,但还有个别不能采用这种“添加服务引用”的方式,目前已知的就是信用中心服务。对于这种情况,需要在VS中以Web引用的方式来添加,具体方法如下。

右键点击解决方案浏览器中项目或引用(Reference)的节点,在菜单中选择“添加服务引用”(Add Service Reference),在弹出的对话框里点击“高级”(Advanced),再在弹出的服务引用设置对话框里点击“添加Web引用”(Add Web Reference)即可调出添加Web引用的对话框。

技术分享  技术分享

至于为什么要这样,由于我对SOAP和WCF没有太多了解,实在没法回答这个问题,希望这方面的大神可以给出解答。

访问代码

引用添加完以后,VS会为我们自动生成好相应的类型,直接使用就可以。

首先是获取令牌,统一验证服务的客户端类型是AuthenServiceClient,实例化以后调用他的authenticate方法,方法签名如下:

authenticate(string applicant, string userid, string password, string resource)

关于这个方法的具体说明,可参考官方说明

返回值的tokenValid属性指示是否验证成功,如果为true,可通过token属性获取令牌的值。示例代码如下:

 1 private bool Authenticate(LoginkUser user, string resId, out string token)
 2 {
 3     AuthenServiceClient clnt = new AuthenServiceClient();
 4 
 5     var result = clnt.authenticate(user.ExchangeCode, user.ExchangeCode, user.Password, resId);
 6 
 7     if (result.tokenValied)
 8         token = result.token;
 9     else
10         token = null;
11 
12     clnt.Close();
13 
14     return token != null;
15 }

得到令牌以后,就可以直接调用信用中心的查询服务了,VS生成的信用中心服务的客户端类型为LoginkServiceService,实例化后调用它的InterfaceName方法。

genericResult InterfaceName(authentication Authentication, publicInformation PublicInformation, string BusinessInformation)

这个方法没有找到官方的文档,由于各个参数比较复杂,就不一一介绍了(其实我自己也没搞明白),直接照抄下面的示例就可以了。

 1 private string CallCreditService(LoginkUser user, string token, string action, string request)
 2 {
 3     var css = _settings.CreditService;
 4 
 5     Logink.Services.Credit.security security = new Logink.Services.Credit.security();
 6     security.LogisticsExchangeCode = user.ExchangeCode;
 7     security.UserTokenID = token;
 8 
 9     Logink.Services.Credit.authentication authentication = new Logink.Services.Credit.authentication();
10     authentication.UserName = user.ExchangeCode;
11     authentication.UserPassword = user.Password;
12     authentication.ServiceId = css.ResourceId;
13     authentication.UserId = user.ExchangeCode;
14 
15     Logink.Services.Credit.publicInformation publicInformation = new Logink.Services.Credit.publicInformation();
16     publicInformation.ServiceType = "3";
17     publicInformation.ActionType = action;
18 
19     Logink.Services.Credit.LoginkServiceService service = new Logink.Services.Credit.LoginkServiceService();
20     service.Url = css.Url;
21     service.Security = security;
22 
23     var result = service.InterfaceName(authentication, publicInformation, request);
24 
25     if (result.ResultCode)
26     {
27         return result.BusinessInformation;
28     }
29     else
30         throw new ExchangeException(result.ExceptionInformationCode, result.ExceptionInformation);
31 }

示例中这个CallCreditService方法已经封装了调用信用中心服务的各种参数,其中action参数表示业务类型,官网有介绍,下面再详细说下request参数。

request参数实际上是个经过Base64编码的XML字符串,XML的内容就是各个传入参数的值,需要注意的是,传入的这个XML串并不是完整的文档,而是根节点以下的内容,千万不要把根节点也传上来,如果你使用XmlDocument来处理传入参数,可以使用根节点的InnerXml属性。

Base64编码相对来说就比较简单了,System.Convert类型直接支持转换为Base64,默认情况下电子枢纽使用的是UTF8编码,在编/解码时不要搞错,否则会查不到数据或出现乱码。

1 private string XmlToBase64(string xml)
2 {
3     if (string.IsNullOrEmpty(xml))
4         return xml;
5 
6     return Convert.ToBase64String(Encoding.Utf8.GetBytes(xml));
7 }

最后,需要处理的是InterfaceName的返回值,返回值的ResultCode指示是否调用成功,如果不成功可通过ExceptionInformationCode属性获取错误代码,否则可以通过BusinessInformation属性获取返回的文本。

返回的文本同样是一个Base64编码的XML字符串,转换成明文以后就可以直接使用了,不过对于明文的处理是一件比较头痛的事,经过多次试验最终摸索出以下的规律。

文本为空串:可能是没有查询到相关的内容。

文本不是XML:尽管ResultCode为true,但仍旧可能是出现了错误,文本的内容就是出错信息。

对于这些情况,我们的程序都应该进行相应的处理。

 1 public XmlDocument QueryCredit(QueryParameters parameters)
 2 {
 3     if (parameters == null)
 4         throw new ArgumentNullException(nameof(parameters));
 5 
 6     AccessToken token;
 7     string data;
 8     bool forceRenewToken = false;
 9 
10     retry:
11 
12     // 通过统一验证服务获取用户的访问令牌
13     token = GetToken(_user, _settings.CreditService.ResourceId, forceRenewToken);
14 
15     // 将传入参数序列化为XML
16     data = parameters.GetXml();
17     // 对XML转换为BASE64编码
18     data = XmlToBase64(data);
19 
20     try
21     {
22         // 调用信用中心的Web Service
23         data = CallCreditService(_user, token.Value, parameters.ActionName, data);
24     }
25     catch(ExchangeException ee)
26     {
27         // 判断是否需要更新令牌
28         if (ee.IsTokenInvalid && !forceRenewToken)
29         {
30             forceRenewToken = true;
31             goto retry;
32         }
33         else
34             throw;
35     }
36 
37     if (!string.IsNullOrEmpty(data))
38     {
39         // 返回的内容已做了BASE64编码处理,将它转换为XML。
40         data = Base64ToXml(data);
41 
42         // 部分情况下平台返回的可能是一串错误信息而非XML,因此对不是"<"开头的直接按错误信息处理。
43         if (data[0] == <)
44         {
45             XmlDocument doc = new XmlDocument();
46             doc.LoadXml(data);
47 
48             return doc;
49         }
50         else
51             throw new ExchangeException(data);
52     }
53     else
54     {
55         // 如果返回的内容为空,可能是没有查到相关数据。
56         throw new ExchangeException("110008", "暂时没有查到相应数据");
57     }
58 
59 }

到些为止,调用信用中心服务所需的代码都已经大致做了介绍,把它们串起来以后就形成了一个完整的程序,全部源代码请点击此处。由于我的电脑上装的是VS2015,低版本的VS可能没办法打开,实在抱歉。

相关资源

几个必须加入的QQ群

213604083:平台接入群,这是必加的一个群,有很多平台的管理人员在里面,一些基础的问题可以问问他们,当然还有一点很重要的是群里有开发所需要的许多资源。

383412768:信用接入群,如果要使用信用中心服务,这就是你要找的组织。

363016382:园区通接入群,如果你是为了接入而接入(你懂的),那这里是也是必须的。

601484722:充装数据接入群。

用.net访问电子枢纽信用中心的数据查询服务

标签:解决方案   style   uri   height   public   规律   private   实例化   html   

原文地址:http://www.cnblogs.com/effun/p/6126675.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!