2013-08-07 28 views
1

我有以下POST編輯的操作方法,它主要執行兩個更新操作: -處理併發異常與外部API調用

  1. 編輯外部系統起訴API調用的對象。
  2. 在我們的系統數據庫上編輯對象。

    [HttpPost] 
    public ActionResult Create(RackJoin rj, FormCollection formValues) 
    {string controllername = RouteData.Values["controller"].ToString(); 
    if (ModelState.IsValid) 
    { var message = ""; 
           var status = ""; 
           long assetid = new long(); 
           XmlDocument doc = new XmlDocument(); 
           using (var client = new WebClient()) 
           { 
            var query = HttpUtility.ParseQueryString(string.Empty); 
            foreach (string key in formValues) 
            { 
             query[key] = this.Request.Form[key]; 
            } 
    
    query["username"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiUserName"]; 
    query["password"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiPassword"]; 
    string apiurl = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiURL"]; 
    var url = new UriBuilder(apiurl); 
    url.Query = query.ToString(); 
    try 
    { 
    string xml = client.DownloadString(url.ToString()); 
    
             doc.LoadXml(xml); 
    status = doc.SelectSingleNode("/operation/operationstatus").InnerText; 
             message = doc.SelectSingleNode("/operation/message").InnerText; 
    } 
            catch (WebException ex) 
            { 
             ModelState.AddModelError(string.Empty, "Error occurred:" + ex.InnerException); 
            } 
           } 
           if (status.ToUpper() == "SUCCESS") 
          { 
           repository.InsertOrUpdateRack(rj.Rack, User.Identity.Name, rj.Resource.RESOURCEID); 
           repository.Save(); 
           return RedirectToAction("Index"); 
          } 
          else 
          { 
           ModelState.AddModelError(string.Empty, message.ToString()); 
    
          } 
         } 
        } 
        catch (DbUpdateConcurrencyException ex) 
        { 
    

如上面的代碼中,我不會做repository.save()來更新我們的系統上的對象,除非API返回一個「成功」的顯示。 但目前我正面臨以下問題: - 如果API返回「成功」但發生了併發異常,那麼API將更新外部系統上的對象,但該對象不會在我們的系統上更新? 那麼有沒有辦法來處理這種情況?

回答

1

有沒有簡單的方法來解決這種情況。處理它的一種方法是要求外部API的設計者公開一種方法,允許在之前的調用中完成事務處理。基本上你的第一次調用會修改外部系統,但有一些布爾標誌表明這些更改仍然未決。然後,您更新您的系統,如果成功,您將調用外部API將數據從掛起標記爲有效。

如果您無法控制外部API,並且它會使第一次調用中的數據更改無法恢復,那麼恐怕您沒有太多選擇餘地。在調用API之前,您可能會記住您在外部系統上修改的對象的狀態,並且在系統出現異常時,通過調用具有先前值的API將還原爲以前的狀態。

+0

感謝您的回覆,不幸地要求修改API是不可能的,因爲我們從外部公司購買它。 –