2016-04-14 12 views
12

मेरे सेटअप:एसक्यूएल लिखने नहीं सहेजता है

  • ASP.NET 4.5 वेब एपीआई (Azure पर) एसक्यूएल डाटाबेस (भी Azure पर)
  • AngularJS वेब सामने से बचत डेटा अंत (एक और Azure वेबसाइट)

जब कोई उपयोगकर्ता पहले साइन अप करता है, तो मैं उन्हें "परिचय शुरू करना" दिखाता हूं। परिचय केवल एक बार चलाने के लिए माना जाता है - मैं एएसपी.NET उपयोगकर्ता तालिका में एक कस्टम फ़ील्ड के रूप में परिचय लॉन्च तिथि का टाइमस्टैम्प लॉग करता हूं।

जब मैं लॉग इन करता हूं (उपयोगकर्ता के रूप में) में मेरा आश्चर्य की कल्पना करें और परिचय TWICE देखें।

एंगुलरजेएस फ्रंट एंड एएसपी.NET एपीआई को "परिचय देखा गया" संदेश भेज रहा है, और एपीआई सफलता संदेश के साथ प्रतिक्रिया देता है। हालांकि, जब मैं डीबी में कच्चे डेटा को देखता हूं, तो टाइमस्टैम्प सबसे निश्चित रूप से अपडेट नहीं होता है। नतीजतन, उपयोगकर्ता दूसरी बार परिचय देखेंगे (जिस बिंदु पर टाइमस्टैम्प डीबी में ठीक से दर्ज किया जाता है)।

मेरे पास एक क्रोधित कामकाज है। क्लाइंट मेरे सर्वर से ओएथ बेयरर टोकन का अनुरोध करने के बाद, क्लाइंट उपयोगकर्ता जानकारी का अनुरोध करता है (यह तय करने के लिए कि टूर दिखाने के लिए या नहीं)। 100ms की प्रतीक्षा कर रहा है और फिर सर्वर पर वापस "टूर देखा गया" संदेश भेजना समस्या को मुखौटा करता है।

मैंने किसी भी बिंदु पर डेटा संग्रहीत करने वाले किसी भी अन्य मुद्दे को नहीं देखा है। चूंकि हमारा डीबी Azure पर है, मैं प्रोफाइलर को हुक नहीं कर सकता और built in auditing मुझे कोई संकेत नहीं देता है।

क्या टोकन का अनुरोध करने के बारे में कुछ है जो एक अजीब स्थिति में एएसपी.NET पहचान छोड़ देता है? और टेबल पर लिखने से पहले यह एक संक्षिप्त प्रतीक्षा लेता है? क्या ऐसे कस्टम फ़ील्ड हैं जो इस तरह की समस्याओं के लिए आधार पहचान सेटअप का विस्तार करते हैं? क्या UserManager संभवतः अपने काले बॉक्स में कुछ अजीब कर रहा है?

क्या किसी को इस समस्या को डीबग करने के लिए सुझाव हैं? या कभी ऐसा कुछ सुना है?

यहाँ प्रासंगिक कोड है कि DB में "दौरे देखी" टाइमस्टैम्प अपडेट करना शुरू कर सकता है:

[HttpPost, Route("UserInfo")] 
    public async Task<IHttpActionResult> UpdateUserInfo(UpdateBindingModel model) 
    { 
     var currentUser = UserManager.FindById(User.Identity.GetUserId()); 

     if (model.FirstName != null) 
     { 
      currentUser.FirstName = model.FirstName; 
     } 
     if (model.LastName != null) 
     { 
      currentUser.LastName = model.LastName; 
     } 
     if (model.SetIntroViewCompleteDate) 
     { 
      currentUser.IntroViewCompleteDate = DateTime.UtcNow; 
     } 
     if (model.SetIntroViewLaunchDate) 
     { 
      currentUser.IntroViewLaunchDate = DateTime.UtcNow; 
     } 
     if (model.SetTipTourCompleteDate) 
     { 
      currentUser.TipTourCompleteDate = DateTime.UtcNow; 
     } 
     if (model.SetTipTourLaunchDate) 
     { 
      currentUser.TipTourLaunchDate = DateTime.UtcNow; 
     } 

     IdentityResult result = await UserManager.UpdateAsync(currentUser); 
     if (result.Succeeded) 
     { 
      var data = new UserInfoViewModel 
      { 
       FirstName = currentUser.FirstName, 
       LastName = currentUser.LastName, 
       IntroViewLaunchDate = currentUser.IntroViewLaunchDate 
      }; 

      return Ok(data); 
     } 

     return InternalServerError(); 
    } 

अद्यतन ********* 4/18

मैं भी है UserManager सामान से पूरी तरह से दूर जाने की कोशिश की। मैंने निम्नलिखित संशोधनों का प्रयास किया है (किसी तालिका से उपयोगकर्ता डेटा खींचना जैसे कि मैं किसी अन्य डेटा तक पहुंचूंगा), लेकिन यह अभी भी वही व्यवहार करता है। मुझे लगता है कि करने के लिए है कि ApplicationUser वस्तु पर कस्टम फ़ील्ड डाल एक बुरा विचार है शुरू कर ...

नए db निकालते हैं और इस तरह दिखता बचाने:

ApplicationDbContext newContext = new ApplicationDbContext(); 
var currentUser = await (from c in newContext.Users 
          where c.Email == User.Identity.Name 
          select c).SingleOrDefaultAsync(); 

//update some values 

await newContext.SaveChangesAsync(); 
+1

आप कहते हैं कि एपीआई एक "सफलता संदेश" के साथ प्रतिक्रिया करता है। फ्रॉम जो मैं आपके कोड में देख सकता हूं, आपको 'UserInfoViewModel' के साथ 200 प्रतिक्रिया मिलेगी। क्या यह मामला है? क्या आप पहले कॉल पर भी निश्चित हैं कि टोकन अनुरोध के साथ भेजा जा रहा है (यानी 'User.Identity.GetUserId() 'आपको सही उपयोगकर्ता देता है)? अंत में, आपके द्वारा टिप्पणी की गई तर्क को जोड़ने के लायक हो सकते हैं - यह उपयोगकर्ता को अपडेट करने से पहले निष्पादित करता है, इसलिए शायद –

+1

सही - 200 प्लस व्यू मॉडल में कुछ चल रहा है। टोकन भेजा जा रहा है और ग्राहक का कॉल ठीक से प्रमाणित है। अच्छा सवाल, यद्यपि। मैं संक्षिप्त कोड के साथ मूल प्रश्न अपडेट करूंगा ... यह बहुत सुंदर है। – waffles

उत्तर

3

ठीक है, मैंने समस्या को हल करने के लिए यहां क्या किया है। मैंने एएसपी.NET पहचान सामग्री में निर्मित से अपने कस्टम उपयोगकर्ता डेटा को पूरी तरह से जोड़ दिया। अब मैं एक अलग वस्तु मिल गया है (और इसलिए अलग एसक्यूएल तालिका) में प्रथम, अंतिम नाम, LastActiveDate, आदि जैसी चीजों को संग्रहीत करता है, आदि

यह मेरी समस्या पूरी तरह से हल किया है, हालांकि यह में डेटाबेस के लिए एक और कॉल शुरू की है कुछ खास स्थितियां। मैंने इसे चिंता करने के लिए एक बड़ा पर्याप्त प्रदर्शन मुद्दा माना है। मुझे लगता है कि यह एक अजीब दौड़ की स्थिति थी जिसमें एएसपी.NET पहचान उपयोगकर्ता के लिए टोकन की पीढ़ी शामिल थी, फिर जल्दी से एक एज़ूर एसक्यूएल डेटाबेस को लिखना - भगवान जानता है कि यह वास्तव में मेरे कोड में क्या था जिससे समस्या उत्पन्न हुई।

यदि आपको कोई समस्या है जो हल करना मुश्किल है, तो अक्सर सबसे अच्छी योजना समस्या को बदलना है।

अब मैं क्या इनाम अंक के साथ क्या करना है जब आप समस्या उड़ा दिया गया है पर चर्चा एक मेटा धागा खोजने की जरूरत है ...

5

मूल रूप से समस्या का आरंभीकरण के साथ हो सकता है `UserManager 'और तथ्य यह है कि यह वर्ग डीबी संदर्भ पर काम करता है, इसलिए आपको उस संदर्भ में परिवर्तनों को जारी रखने की आवश्यकता है। यहां एक उदाहरण दिया गया है:

var userStore = new UserStore<ApplicationUser>(new MyDbContext()); 
var userManager = new UserManager(userStore); 

इस तरह आप प्रबंधक और संदर्भ दोनों को याद करते हैं।फिर अपने विधि में आप सामान्य रूप से कहेंगे:

IdentityResult result = await userManager.UpdateAsync(currentUser); 

db संदर्भ के लिए यह परिवर्तन बने के बाद:

var dbContext = userStore.context; 
dbContext.saveChanges(); 
+0

अच्छा, यह एक बहुत अच्छा जवाब जैसा प्रतीत होता है, इसलिए मैंने आपको +1 दिया। मैं वास्तव में समस्या को अभी पुन: उत्पन्न नहीं कर सकता, इसलिए मुझे इसे समझने के लिए और अधिक परीक्षण की आवश्यकता है। मैंने कुछ भी नहीं बदला। मुझे लगता है कि यह कुछ अजीब दौड़ की स्थिति है (और चीजें अभी जल्दी चल रही हैं) या मैंने पूरी चीज की कल्पना की ... – waffles

+0

अधिक परीक्षण से पता चला है कि इससे समस्या ठीक नहीं हुई है - न ही मेरा प्रयास टालने से UserManager। विवरण के साथ मूल पोस्ट अद्यतन किया। तथ्य यह है कि मैं आज सुबह की समस्या को पुन: पेश नहीं कर सकता, रेस कंडीशन-वाई महसूस करता है ... शायद मेरे सर्वर/डीबी को लोड करने के साथ कुछ है ... – waffles

+1

@ वाफल्स क्या आप स्थानीय डीबी पर आपको एप चलाने की कोशिश कर सकते हैं ? सिर्फ अजीब मुद्दों को खत्म करने के लिए? – Lesmian

4

अपनी टिप्पणी 100ms मास्क मुद्दा इंतजार कर रहे हैं, मुझे लगता है कि आप एक समस्या हो सकती है के आधार पर एकाधिक async कॉल का इंतजार कर रहा है। कॉल को समकालिक रूप से चलाने का प्रयास करें और देखें कि क्या आपके पास अभी भी एक ही समस्या है या नहीं। मेरा अनुमान है कि समस्या दूर हो सकती है। मेरा अनुभव यह रहा है कि एसिंक प्रतीक्षा का उपयोग करना मुश्किल हो सकता है जब आप एसिंक्रोनस विधियों को कॉल करते हैं जो अन्य एसिंक्रोनस विधियों को कॉल करते हैं। आपके पास कोड हो सकता है जो उचित परिणामों के बिना निष्पादित हो रहा है।

+0

एक और अच्छा सुझाव है, लेकिन मैंने पहले ही कोशिश की है। डेटा दृढ़ता व्यवहार में कोई बदलाव नहीं। हालांकि धन्यवाद... – waffles

संबंधित मुद्दे