用.net訪問電子樞紐信用中心的數據查詢服務

来源:http://www.cnblogs.com/effun/archive/2016/12/02/6126675.html
-Advertisement-
Play Games

電子樞紐全稱國家交通運輸物流公共信息平臺,主要提供物流及生產企業進行物流相關數據交換的標準和API。信用中心是電子樞紐眾多數據服務中的一個,提供物流參與者信用信息的上傳和查詢,包括運輸車輛、從業人員等。官方的示例和介紹大多以Java為主,.net的非常少,希望本文可以幫助.net開發人員快速掌握數據... ...


概要說明

電子樞紐全稱國家交通運輸物流公共信息平臺,主要提供物流及生產企業進行物流相關數據交換的標準和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:充裝數據接入群。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 從資料庫獲取構造樹結構是ExtJS TreePanel的核心技術,常用方法是TreeStroe里配置proxy,這種方式的root成了一個不受控制的節點。 TreeStroe的root實際是一個層疊json數據,大部分情況是直接寫一些簡單數據,但在實際應用中必定是要從資料庫讀取的。我的方法是先用Ex... ...
  • 代碼: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using Syste ...
  • 應用場景 應用場景 項目開發決定使用angular2進行前後端分離開發,由我負責後端服務的開發,起初選擇的是web api進行開發。對跨域訪問通過API中間件+過濾器對跨域訪問進行支持。開發一段後,通知需要移植到MVC4項目中一同發佈angular2並且放棄API,但前期開發仍然需要分離開發。 遇到 ...
  • 今天在做發送郵件功能時,開始用qq郵箱和163郵箱都可以正常發送,後再改用我公司的郵箱和smtp時竟然報錯了。 異常提示 “根據驗證過程,遠程證書無效”,後來通過查詢資料解決該問題,上代碼: ...
  • "原文地址:FileProvider" By [Steve Smith][1] ASP.NET Core通過對File Providers的使用實現了對文件系統訪問的抽象。 [查看或下載示例代碼][2] File Provider 抽象 File Providers是文件系統之上的一層抽象。它的主要 ...
  • 參考:http://www.cnblogs.com/dunitian/p/5218140.html 簡單點,直接上用法 新建MVC項目,在golbal.asax中添加如下代碼 新建一個view,增加iphone.cshtml為尾碼的文件 那麼如果user-agent中包含iphone,就會打開該頁面 ...
  • 一年多沒更新博客園內容了,core已經發生了翻天覆地的變化,想起2014年這時候,我就開始了從當時還叫k的那套preview都不如的vnext搭建這套系統,陸陸續續它每一次升級,我也相應地折騰,大約4個月前,我開始把生產環境的一部分從 windows server 遷移到 centos 7 上,觀察... ...
  • 其實任何資料裡面的任何知識點都無所謂,都是不重要的,重要的是學習方法,自行摸索的過程(不妥之處歡迎指正) 彙總:http://www.cnblogs.com/dunitian/p/4822808.html#mvc 本章Demo:https://github.com/dunitian/LoTCodeB ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...