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