1. <dd id="erndk"></dd>
                1. C#開發BIMFACE系列12 服務端API之文件轉換

                  張傳寧 2019/9/4 21:25:14

                  系列目錄 【已更新最新開發文章,點擊查看詳細】 在代表模型的源文件上傳到BIMFACE后,一般會進行三種API調用操作: 發起模型轉換 查詢轉換狀態 如轉換成功,獲取模型轉換后的BIM數據 在模型成功進行轉換后,模型內的BIM信息會在云端進行解析,抽取并結構化入庫。這些信息包含: 構件屬性信息 構件

                  在代表模型的源文件上傳到BIMFACE后,一般會進行三種API調用操作:

                  1. 發起模型轉換

                  2. 查詢轉換狀態

                  3. 如轉換成功,獲取模型轉換后的BIM數據

                  在模型成功進行轉換后,模型內的BIM信息會在云端進行解析,抽取并結構化入庫。這些信息包含:
                  • 構件屬性信息

                  • 構件分類樹

                  • 樓層

                  • 單體

                  • 專業

                  • 構件材質

                  • 模型鏈接

                  • 空間

                  • 房間

                  • 圖紙

                  • …?

                  在確認模型轉換成功后,為了開發者能方便的獲取這些BIM信息并集成在自己的應用中,BIMFACE提供了一系列的數據接口,這些接口支持兩種驗權方式:

                  Access token: 代表自身應用的身份,使用應用的appkey, secret,通過調用/oauth2/token接口獲取。
                  View token:    代表對單個模型的訪問權限,使用access token,通過調用/view/token以及相關接口獲得。

                  發起轉換

                  請求地址:PUT https://api.bimface.com/translate

                  說明:源文件上傳成功后,即可發起對該文件的轉換。由于轉換不能立即完成,BIMFace支持在文件轉換完成以后,通過Callback機制通知應用;另外,應用也可以通過接口查詢轉換狀態。

                  參數:application/json 格式

                  請求 path(示例):https://api.bimface.com/translate

                  請求 header(示例):"Authorization: Bearer dc671840-bacc-4dc5-a134-97c1918d664b"

                  請求 body(示例):

                  {
                    "callback" : "https://api.glodon.com/viewing/callback?authCode=iklJk0affae&signature=2ef131395fb6442eb99abd83d45c3201",
                    "config" : {
                      "string" : "string"
                    },
                    "priority" : 2,
                    "source" : {
                      "compressed" : false,
                      "fileId" : 1277823232112,
                      "rootName" : "rootFileName.rvt"
                    }
                  } 
                  注意:請求體中的 config 可以設置為空。"config":null 或者傳入指定的轉換參數 "config":{"texture":true} 。

                  HTTP響應示例(200):

                  {
                    "code" : "success",
                    "data" : {
                      "createTime" : "2017-12-25 17:23:46",
                      "databagId" : "9b711803a43b92d871cde346b63e5019",
                      "fileId" : 1248789071339712,
                      "name" : "bimface_2018.rvt",
                      "priority" : 2,
                      "reason" : "reason",
                      "status" : "success",
                      "thumbnail" : [ "https://m.bimface.com/9b711803a43b92d871cde346b63e5019/thumbnail/96.png", "https://m.bimface.com/9b711803a43b92d871cde346b63e5019/thumbnail/256.png" ]
                    },
                    "message" : ""
                  }
                   
                  請求體內的參數解釋
                   

                  DGW與RVT格式的文件轉換的配置參數不同,所以封裝了2個對應的C#類:

                   1 /// <summary>
                  ///  發起DWG文件轉化的請求數據
                  /// </summary>
                  [Serializable]
                  public class DwgFileTranslateRequest : FileTranslateRequest
                  {
                      /// <summary>
                      ///  Dwg模型轉換引擎自定義參數,config參數跟轉換引擎相關,不同的轉換引擎支持不同的config格式。
                      /// 例如轉換時添加內置材質,則添加參數值{"texture":true},添加外部材質時參考“使用模型外置材質場景”請求報文。
                      /// 如果不需要設置該參數,則設置為null
                      /// </summary>
                      [JsonProperty("config", NullValueHandling = NullValueHandling.Ignore)]
                      public DwgModelConfig Config { get; set; }
                  }
                   1 /// <summary>
                  ///  發起Rvt文件轉化的請求數據
                  /// </summary>
                  [Serializable]
                  public class RvtFileTranslateRequest : FileTranslateRequest
                  {
                      /// <summary>
                      ///  Rvt模型轉換引擎自定義參數,config參數跟轉換引擎相關,不同的轉換引擎支持不同的config格式。
                      /// 例如轉換時添加內置材質,則添加參數值{"texture":true},添加外部材質時參考“使用模型外置材質場景”請求報文。
                      /// 如果不需要設置該參數,則設置為null
                      /// </summary>
                      [JsonProperty("config", NullValueHandling = NullValueHandling.Ignore)]
                      public RvtModelConfig Config { get; set; }
                  }
                  1 /// <summary>
                  ///  其他三維模型文件,包括RVT格式文轉化的請求數據
                  /// </summary>
                  [Serializable]
                  public class Other3DModelFileTranslateRequest : RvtFileTranslateRequest
                  {
                  }
                   1 [Serializable]
                  public class TranslateSource
                  {
                      public TranslateSource()
                      {
                          Compressed = false;
                          RootName = null;
                      }
                  
                      /// <summary>
                      ///  文件Id,即調用上傳文件API返回的fileId
                      /// </summary>
                      [JsonProperty("fileId")]
                      public long FileId { get; set; }
                  
                      /// <summary>
                      ///  是否為壓縮文件,默認為false
                      /// </summary>
                      [JsonProperty("compressed")]
                      public bool Compressed { get; set; }
                  
                      /// <summary>
                      ///  如果是壓縮文件,必須指定壓縮包中哪一個是主文件。(例如:root.rvt)。
                      /// 如果不是壓縮,則設置為 null
                      /// </summary>
                      [JsonProperty("rootName", NullValueHandling = NullValueHandling.Ignore)]
                      public string RootName { get; set; }
                  }

                  共同的基類FileTranslateRequest:

                   1 /// <summary>
                  ///  發起文件轉化的請求數據
                  /// </summary>
                  [Serializable]
                  public class FileTranslateRequest
                  {
                      public FileTranslateRequest()
                      {
                          Priority = 2;
                          CallBack = "http://www.app.com/receive";
                      }
                  
                      [JsonProperty("source")]
                      public TranslateSource Source { get; set; }
                  
                      /// <summary>
                      /// 優先級,數字越大,優先級越低。只能是1, 2, 3。默認為2
                      /// </summary>
                      [JsonProperty("priority")]
                      public int Priority { get; set; }
                  
                      /// <summary>
                      ///  Callback地址,待轉換完畢以后,BIMFace會回調該地址
                      /// </summary>
                      [JsonProperty("callback")]
                      public string CallBack { get; set; }
                  }

                  不同模型轉換支持的自定義參數config:

                  (1) rvt模型

                  對應封裝成的C#實體類:

                   1 /// <summary>
                  ///  rvt 模型配置項
                  /// </summary>
                  [Serializable]
                  public class RvtModelConfig
                  {
                      public RvtModelConfig()
                      {
                          //設置 null,在序列化的時候忽略該字段,不出現在序列化后的字符串中
                          Texture = null;
                          ExportDwg = null;
                          ExportDrawing = null;
                          ExportPdf = null;
                          ViewName = null;
                          DisplayLevel = null;
                          ExportDwgInstance = null;
                          ExportHiddenObjects = null;
                          ExportSystemType = null;
                          ExportProperties = null;
                          Unit = null;
                          ExportSchedule = null;
                      }
                  
                      /// <summary>
                      ///  轉換時是否添加材質。默認為 false
                      /// </summary>
                      [JsonProperty("texture", NullValueHandling = NullValueHandling.Ignore)]
                      public bool? Texture { get; set; }
                  
                      /// <summary>
                      ///  rvt2md是否導出dwg文件。默認為 false
                      /// </summary>
                      [JsonProperty("exportDwg", NullValueHandling = NullValueHandling.Ignore)]
                      public bool? ExportDwg { get; set; }
                  
                      /// <summary>
                      ///  dwg2md是否導出mdv(矢量化圖紙);取值為true時,exportDwg自動設置為true。默認為 false
                      /// </summary>
                      [JsonProperty("exportDrawing", NullValueHandling = NullValueHandling.Ignore)]
                      public bool? ExportDrawing { get; set; }
                  
                      /// <summary>
                      ///  dwg2md是否導出pdf文件。默認為 false
                      /// </summary>
                      [JsonProperty("exportPdf", NullValueHandling = NullValueHandling.Ignore)]
                      public bool? ExportPdf { get; set; }
                  
                      /// <summary>
                      ///  轉換使用的3D視圖。默認為 {3D}
                      /// </summary>
                      [JsonProperty("viewName", NullValueHandling = NullValueHandling.Ignore)]
                      public string ViewName { get; set; }
                  
                      /// <summary>
                      ///  設置轉換的精細度,fine(精細),medium(中等),coarse(粗略)。默認為 fine
                      /// </summary>
                      [JsonProperty("displaylevel", NullValueHandling = NullValueHandling.Ignore)]
                      public string DisplayLevel { get; set; }
                  
                      /// <summary>
                      /// 是否導出dwg實例。默認為 false
                      /// </summary>
                      [JsonProperty("exportDwgInstance", NullValueHandling = NullValueHandling.Ignore)]
                      public bool? ExportDwgInstance { get; set; }
                  
                      /// <summary>
                      /// 是否導出三維視圖中隱藏的構件。默認為 false
                      /// </summary>
                      [JsonProperty("exportHiddenObjects", NullValueHandling = NullValueHandling.Ignore)]
                      public bool? ExportHiddenObjects { get; set; }
                  
                      /// <summary>
                      /// 是否在userData中加入mepSystemType。默認為 false
                      /// </summary>
                      [JsonProperty("exportSystemType", NullValueHandling = NullValueHandling.Ignore)]
                      public bool? ExportSystemType { get; set; }
                  
                      /// <summary>
                      /// 是否在導出NWD的屬性db文件。默認為 false
                      /// </summary>
                      [JsonProperty("exportProperties", NullValueHandling = NullValueHandling.Ignore)]
                      public bool? ExportProperties { get; set; }
                  
                      /// <summary>
                      ///  設置轉換使用的單位,取值"ft"\"feet"\"英尺"采用revit默認的英尺為單位,默認以毫米為單位。默認為空
                      /// </summary>
                      [JsonProperty("unit", NullValueHandling = NullValueHandling.Ignore)]
                      public string Unit { get; set; }
                  
                      /// <summary>
                      /// 是否使用明細表內容。默認為 false
                      /// </summary>
                      [JsonProperty("exportSchedule", NullValueHandling = NullValueHandling.Ignore)]
                      public bool? ExportSchedule { get; set; }
                  }

                  Rvt轉換配置中很多選項都是有默認值的,如果手動設置的值與默認值相同,那么可以不用設置該項。

                  為了簡化顯示請求body中的config配置項,在構造函數中將數值類型的配置項默認設置為 null,再配合 Newtonsoft.Json.dll

                  [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 屬性,在序列化時可以不生成該項。

                  (2) dwg模型

                  對應封裝成的C#實體類

                   1 /// <summary>
                  ///  dwg 模型配置項
                  /// </summary>
                  [Serializable]
                  public class DwgModelConfig
                  {
                      /// <summary>
                      ///  是否轉成矢量圖紙,默認為 true
                      /// </summary>
                      [JsonProperty("exportDrawing")]
                      public bool ExportDrawing { get; set; }
                  
                      /// <summary>
                      ///  是否導出pdf文件,默認為 false
                      /// </summary>
                      [JsonProperty("exportPdf")]
                      public bool ExportPdf { get; set; }
                  
                      /// <summary>
                      ///  是否導出縮略圖,默認為 true
                      /// </summary>
                      [JsonProperty("exportThumb")]
                      public bool ExportThumb { get; set; }
                  }

                   

                  下面分別介紹常用的不同類型的文件轉換場景

                  1、DWG文件轉換成矢量圖紙

                  請求 body(示例):

                  {
                      "source":{
                          "fileId":1402934652281952,            // 文件ID
                          "compressed":false                    // 文件是否為壓縮文件
                      },
                      "priority":2,                             // 轉換優先級
                      "callback":"http://www.app.com/receive",  // 回調地址
                      "config":null                             // 轉換配置選項
                  } 

                  C#實現方法:

                   1 /// <summary>
                  ///  發起轉換。將DWG文件轉換成圖片。
                  /// </summary>
                  /// <param name="accessToken">令牌</param>
                  /// <param name="request">DWG文件轉化的請求數據對象。根據實際需要設置對象里面的參數,不需要的參數不用賦值</param>
                  /// <returns></returns>
                  public virtual FileTranslateResponse TranslateDwgToPicture(string accessToken, DwgFileTranslateRequest request)
                  {
                      string data = request.SerializeToJson();
                      return TranslateFile(accessToken, data);
                  }

                   其中調用的 TranslateFile()方法如下:

                   1 /// <summary>
                  ///  發起轉換。
                  ///  源文件上傳成功后,即可發起對該文件的轉換。由于轉換不能立即完成,BIMFace支持在文件轉換完成以后,通過Callback機制通知應用;
                  ///  另外,應用也可以通過接口查詢轉換狀態
                  /// </summary>
                  /// <param name="accessToken">令牌</param>
                  /// <param name="data">請求體數據</param>
                  /// <returns></returns>
                  private FileTranslateResponse TranslateFile(string accessToken, string data)
                  {
                      //PUT https://api.bimface.com/translate
                      string url = BimfaceConstants.API_HOST + "/translate";
                  
                      BimFaceHttpHeaders headers = new BimFaceHttpHeaders();
                      headers.AddOAuth2Header(accessToken);
                  
                      try
                      {
                          FileTranslateResponse response;
                  
                          HttpManager httpManager = new HttpManager(headers);
                          HttpResult httpResult = httpManager.Put(url, data);
                          if (httpResult.Status == HttpResult.STATUS_SUCCESS)
                          {
                              response = httpResult.Text.DeserializeJsonToObject<FileTranslateResponse>();
                          }
                          else
                          {
                              response = new FileTranslateResponse
                              {
                                  Message = httpResult.RefText
                              };
                          }
                  
                          return response;
                      }
                      catch (Exception ex)
                      {
                          throw new Exception("[發起文件轉換]發生異常!", ex);
                      }
                  }

                  該方法在后面的幾種模型轉換中也會用到,是公用的方法。

                  其中調用到的 httpManager.Put() 方法,請參考《C# HTTP系列》

                  2、DWG文件轉換成圖片

                  請求 body(示例):

                  {
                      "source":{
                          "fileId":857482189666208,
                          "compressed":false,
                          "rootName":"root.dwg"
                      },
                      "priority":2,
                      "callback":"http://www.app.com/receive",
                      "config":{
                              "exportDrawing":false             // 是否轉成矢量圖紙
                      }
                  }

                  C#實現方法: 

                   1 /// <summary>
                  ///  發起轉換。將DWG文件轉換成圖片。
                  /// </summary>
                  /// <param name="accessToken">令牌</param>
                  /// <param name="request">DWG文件轉化的請求數據對象。根據實際需要設置對象里面的參數,不需要的參數不用賦值</param>
                  /// <returns></returns>
                  public virtual FileTranslateResponse TranslateDwgToPicture(string accessToken, DwgFileTranslateRequest request)
                  {
                      string data = request.SerializeToJson();
                      return TranslateFile(accessToken, data);
                  }
                  3、RVT文件轉換成著色模式的效果

                  請求 body(示例):

                  {
                      "source":{
                          "fileId":857482189666208,
                          "compressed":false,
                          "rootName":"root.rvt"       // 如果是壓縮文件,必須指定壓縮包中哪一個是主文件
                      },
                      "priority":2,
                      "callback":"http://www.app.com/receive",
                      "config":null
                  }

                  C#實現方法:

                   1 /// <summary>
                  ///  發起轉換。將RVT文件轉換成著色模式的效果。
                  /// </summary>
                  /// <param name="accessToken">令牌</param>
                  /// <param name="request">RVT文件轉化的請求數據對象。根據實際需要設置對象里面的參數,不需要的參數不用賦值</param>
                  /// <returns></returns>
                  public virtual FileTranslateResponse TranslateRvtToRenderStyle(string accessToken, RvtFileTranslateRequest request)
                  {
                      string data = request.SerializeToJson();
                      return TranslateFile(accessToken, data);
                  }
                  4、RVT文件轉換成真實模式的效果

                  請求 body(示例):

                  {
                      "source":{
                          "fileId":857482189666208,
                          "compressed":false,
                          "rootName":"root.rvt"
                      },
                      "priority":2,
                      "callback":"http://www.app.com/receive",
                      "config":{"texture":true}                 // 轉換時是否添加材質
                  }

                  C#實現方法:

                   1 /// <summary>
                  ///  發起轉換。將RVT文件轉換成真實模式的效果。
                  /// </summary>
                  /// <param name="accessToken">令牌</param>
                  /// <param name="request">RVT文件轉化的請求數據對象。根據實際需要設置對象里面的參數,不需要的參數不用賦值</param>
                  /// <returns></returns>
                  public virtual FileTranslateResponse TranslateRvtToRealStyle(string accessToken, RvtFileTranslateRequest request)
                  {
                      string data = request.SerializeToJson();
                      return TranslateFile(accessToken, data);
                  }
                  5、RVT格式文件轉換成具備二三維聯動的功能

                  請求 body(示例):

                  {
                      "source":{
                          "fileId":1402934652281952,
                          "compressed":false
                      },
                      "priority":2,
                      "config":{
                          "texture": false,        // 轉換時是否添加材質
                          "exportDwg": true,       // rvt2md是否導出dwg文件
                          "exportPdf": true,       // dwg2md是否導出pdf文件
                          "exportDrawing": true    // dwg2md是否導出mdv(矢量化圖紙);取值為true時,exportDwg自動設置為true
                      },
                      "callback":"http://www.app.com/receive"
                  }

                  C#實現方法: 

                   1 /// <summary>
                  ///  發起轉換。將RVT格式文件轉換為具備二三維聯動的功能效果。
                  /// </summary>
                  /// <param name="accessToken">令牌</param>
                  /// <param name="request">RVT文件轉化的請求數據對象。根據實際需要設置對象里面的參數,不需要的參數不用賦值</param>
                  /// <returns></returns>
                  public virtual FileTranslateResponse TranslateRvtTo23LinkStyle(string accessToken, RvtFileTranslateRequest request)
                  {
                      string data = request.SerializeToJson();
                      return TranslateFile(accessToken, data);
                  }
                  6、其它三維模型文件轉換:常規轉換(不帶材質)

                  請求 body(示例):

                  {
                      "source":{
                          "fileId":857482189666208,
                          "compressed":false,
                          "rootName":"root.skp"
                      },
                      "priority":2,
                      "callback":"http://www.app.com/receive",
                      "config":null
                  }

                  C#實現方法:

                   1 /// <summary>
                  ///  發起轉換。其它三維模型文件轉換,常規轉換(不帶材質)
                  /// </summary>
                  /// <param name="accessToken">令牌</param>
                  /// <param name="request">其他三維模型文件,包括RVT格式文件轉化的請求數據對象。根據實際需要設置對象里面的參數,不需要的參數不用賦值</param>
                  /// <returns></returns>
                  public virtual FileTranslateResponse TranslateOther3DModelToWithoutMaterialStyle(string accessToken, Other3DModelFileTranslateRequest request)
                  {
                      string data = request.SerializeToJson();
                      return TranslateFile(accessToken, data);
                  }
                  7、其他三維模型文件包括RVT格式文件,需要轉換出引用的外部材質場景、貼圖等

                  請求 body(示例):

                  {
                      "source":{
                          "fileId":1234621112557376,
                          "compressed":true,
                          "rootName":"bimface_2018_打包材質&系統材質庫.rvt"
                      },
                      "priority":2,
                      "callback":"http://www.app.com/receive",
                      "config":{"texture":true}
                  }

                  C#實現方法:

                   1 /// <summary>
                  ///  發起轉換。
                  ///  其他三維模型文件包括RVT格式文件,需要轉換出引用的外部材質場景、貼圖等
                  /// (上傳的文件必須為壓縮包,壓縮包內同級目錄包含模型文件和關聯的所有材質文件,轉換時必須指定rootName為主文件)。
                  /// </summary>
                  /// <param name="accessToken">令牌</param>
                  /// <param name="request">其他三維模型文件,包括RVT格式文件轉化的請求數據對象。根據實際需要設置對象里面的參數,不需要的參數不用賦值</param>
                  /// <returns></returns>
                  public virtual FileTranslateResponse TranslateOther3DModelToWithMaterialStyle(string accessToken, Other3DModelFileTranslateRequest request)
                  {
                      string data = request.SerializeToJson();
                      return TranslateFile(accessToken, data);
                  }
                   
                  測試

                  在BIMFACE的控制臺中可以看到我們上傳的文件列表,共計2個文件。

                   

                  下面以 rac_advanced_sample_project-三維視圖 - From Parking Area.dwg 文件為例,測試“將DWG文件轉換成矢量圖紙”方法。

                  在如下所示的測試頁面中,DWG文件轉換區域中,選擇相關的轉換參數,然后點擊【將DWG文件轉換成矢量圖紙】按鈕開始轉換

                  刷新控制臺中的列表可以看到該文件的模型狀態顯示為“轉換中”

                  等待幾秒或者幾分鐘后,該文件的模型狀態顯示為“轉換成功”

                  待BIMFace轉換完畢后,根據應用傳入的回調地址,BIMFace會通知轉換結果,轉換可能成功、也可能失敗。

                  查看服務器上配置的Callback處理程序記錄的日志:

                   
                  Callback的配置與業務邏輯

                  Callback的配置項如下:

                  Callback機制與微信開發需要開發者提供開發者服務器的原理類似,用于開發者與第三方(BIMFACE、微信登)平臺進行數據的回傳與邏輯的交互。在ASP.NET開發模式下一般可以采取以下幾種方式來設置:

                  方式1:使用一般處理程序(.ashx) 處理業務邏輯的交互。

                  方式2:建立 ASP.NET WebForm 程序,在具體的 WebForm 頁面的構造函數中處理業務邏輯的交互。

                  方式3:建立 ASP.NET MVC,通過控制器處理業務邏輯的交互。

                  方式4:建立 ASP.NET 程序,通過 WebAPI 處理業務邏輯的交互。

                  本示例種采用了第一種方式。

                  Callback 傳回以下參數:

                  signature(簽名):為了確?;卣{消息是由BIMFace發出的,應用在收到回調消息后,須驗證簽名。簽名的計算方式:MD5(``appKey:appSecret:fileId:status:nonce''),如果應用計算的簽名與BIMFace返回的簽名一致,則證明該消息是安全可靠的。

                  應用收到回調后,須向BIMFace發送回執,回執消息:HTTP STATUS 200

                  BimFaceHandler的回調地址對應的完整邏輯方法如下:
                   1     /// <summary>
                      /// BimFaceHandler 的摘要說明
                      /// </summary>
                      public class BimFaceHandler : IHttpHandler
                      {
                          public void ProcessRequest(HttpContext context)
                          {
                              context.Response.ContentType = "text/plain";
                              //context.Response.Write("Hello World");
                  
                              string appKey = ConfigUtility.GetAppSettingValue("BIMFACE_AppKey");
                              string appSecret = ConfigUtility.GetAppSettingValue("BIMFACE_AppSecret");
                              string uid = context.Request.QueryString["uid"];  // SparkBimFace
                  
                              #region 校驗
                              if (appKey.IsNullOrWhiteSpace())
                              {
                                  LogUtility.Error("BIMFace appKey 配置項沒有配置!");
                  
                                  return;
                              }
                  
                              if (appSecret.IsNullOrWhiteSpace())
                              {
                                  LogUtility.Error("BIMFace appSecret 配置項沒有配置!");
                  
                                  return;
                              }
                  
                              if (uid.IsNullOrWhiteSpace())
                              {
                                  LogUtility.Error("[非法請求]回調地址Url鏈接中的參數 uid 沒有配置或者配置的值為空!");
                  
                                  return;
                              }
                              #endregion
                  
                              long fileId = context.Request.QueryString["fileId"].ToLong();  // 文件ID
                              string status = context.Request.QueryString["status"];         // 轉換的結果
                              string reason = context.Request.QueryString["reason"];         // 若轉換失敗,則返回失敗原因
                              string thumbnail = context.Request.QueryString["thumbnail"];   // 縮略圖地址
                              string nonce = context.Request.QueryString["nonce"];           // 回調隨機數
                              string signature = context.Request.QueryString["signature"];   // BIMFACE的加密簽名
                  
                             
                              string callbackResponse = string.Format("fileId:{0},\r\nstatus:{1},\r\nreason:{2},\r\nthumbnail:{3},\r\nnonce:{4},\r\nsignature:{5}",
                                                                       fileId, status, reason, thumbnail, nonce, signature);
                              string tip;
                              string custCalcSignature;
                              FileConvertApi api = new FileConvertApi();
                              bool checkSignature = api.CheckCallbackSignature(appKey, appSecret, fileId, status, nonce, signature, out custCalcSignature);
                              if (checkSignature)
                              {
                                  tip = "[BIMFace發出的回調信息簽名驗證成功!]"
                                        + Environment.NewLine
                                        + callbackResponse;
                                  LogUtility.Info(tip);
                  
                                  //Todo 此處可以根據fileId把相關的信息寫入數據庫中
                  
                                  // 回執消息:應用收到回調后,須向BIMFace發送回執,回執消息:HTTP STATUS 200
                                  context.Response.Write("HTTP STATUS 200");
                              }
                              else
                              {
                                  tip = "[BIMFace發出的回調信息簽名驗證不通過!]"
                                      + Environment.NewLine
                                      + callbackResponse
                                      + Environment.NewLine
                                      + "自定義計算簽名 custCalcSignature:" + custCalcSignature;
                  
                                  LogUtility.Error(tip);
                  
                                  context.Response.Write(tip);
                              }
                  
                              context.Response.End();
                          }
                  
                          /// <summary>
                          ///  該屬性獲得一個布爾值,指示另一個請求是否可以使用該HTTP處理程序的實例。
                          /// <para>如果設置為true,能提高性能,但要注意線程之間安全性問題。如果設置為false,則線程是安全的</para>
                          /// </summary>
                          public bool IsReusable
                          {
                              get
                              {
                                  return false;
                              }
                          }
                      }

                  其中調用到的 CheckCallbackSignature()方法,用于驗證BIMFace發出的回調消息簽名信息是否安全可靠

                   1 /// <summary>
                  ///  驗證BIMFace發出的回調消息簽名信息是否安全可靠
                  /// </summary>
                  /// <param name="appKey">開發者秘鑰</param>
                  /// <param name="appSecret">開發者密碼</param>
                  /// <param name="fileId">BIMFace發出的回調信息:文件ID</param>
                  /// <param name="status">BIMFace發出的回調信息:轉換的結果</param>
                  /// <param name="nonce">BIMFace發出的回調信息:回調隨機數</param>
                  /// <param name="signature">BIMFace發出的回調信息:簽名</param>
                  /// <param name="custCalcSignature">輸出參數:根據BIMFACE平臺的加密規則計算出來的簽名信息</param>
                  /// <returns></returns>
                  public bool CheckCallbackSignature(string appKey, string appSecret, long fileId, string status, string nonce, string signature, out string custCalcSignature)
                  {
                      custCalcSignature = GetCallbackSignature(appKey, appSecret, fileId, status, nonce);
                  
                      return custCalcSignature == signature;
                  }
                   1 /// <summary>
                  ///  獲取BIMFace發出的回調消息簽名信息
                  /// </summary>
                  /// <param name="appKey">開發者秘鑰</param>
                  /// <param name="appSecret">開發者密碼</param>
                  /// <param name="fileId">BIMFace發出的回調信息:文件ID</param>
                  /// <param name="status">BIMFace發出的回調信息:轉換的結果</param>
                  /// <param name="nonce">BIMFace發出的回調信息:回調隨機數</param>
                  /// <returns></returns>
                  public string GetCallbackSignature(string appKey, string appSecret, long fileId, string status, string nonce)
                  {
                      /* signature(簽名):為了確?;卣{消息是由BIMFace發出的,應用在收到回調消息后,須驗證簽名。
                       * 簽名的計算方式:MD5("appKey:appSecret:fileId:status:nonce"),如果應用計算的簽名與BIMFace返回的簽名一致,則證明該消息是安全可靠的。 
                       */
                  
                      return string.Format("{0}:{1}:{2}:{3}:{4}", appKey, appSecret, fileId, status, nonce).EncryptByMD5();
                  }

                  這里使用C#的自定義擴展方法 EncryptByMD5()

                   1 /// <summary>
                  ///  使用 MD5(不可逆加密) 算法加密字符串
                  /// </summary>
                  /// <param name="this">擴展對象。字符串</param>
                  /// <param name="caseType">字符串大小寫。默認小寫</param>
                  /// <returns></returns>
                  public static string EncryptByMD5(this string @this, CaseType caseType = CaseType.Lower)
                  {
                      using (MD5 md5 = MD5.Create())
                      {
                          var sb = new StringBuilder();
                          byte[] hashBytes = md5.ComputeHash(Encoding.Default.GetBytes(@this));
                          foreach (byte bytes in hashBytes)
                          {
                              sb.Append(bytes.ToString("X2"));//X2 表示二進制
                          }
                  
                          return caseType == CaseType.Upper ? sb.ToString() : sb.ToString().ToLower();
                      }
                  }

                   

                   
                  隨時隨地學軟件編程-關注百度小程序和微信小程序
                  關于找一找教程網

                  本站文章僅代表作者觀點,不代表本站立場,所有文章非營利性免費分享。
                  本站提供了軟件編程、網站開發技術、服務器運維、人工智能等等IT技術文章,希望廣大程序員努力學習,讓我們用科技改變世界。
                  [C#開發BIMFACE系列12 服務端API之文件轉換]http://www.yachtsalesaustralia.com/tech/detail-90339.html

                  贊(0)
                  關注微信小程序
                  程序員編程王-隨時隨地學編程

                  掃描二維碼或查找【程序員編程王】

                  可以隨時隨地學編程啦!

                  技術文章導航 更多>
                  国产在线拍揄自揄视频菠萝

                        1. <dd id="erndk"></dd>