1、 問題描述 最近使用ABP .Net Core框架做一個微信開發,同時採用了一個微信開發框架集成到ABP,在微信用戶關註的推送事件里調用了一個async 方法,由於沒有返回值,也沒做任何處理,本地調試也OK,但一發佈到線上就有問題,微信公眾號關註成功,也有推送消息過來,但微信用戶一直保存不上,查 ...
1、 問題描述
最近使用ABP .Net Core框架做一個微信開發,同時採用了一個微信開發框架集成到ABP,在微信用戶關註的推送事件里調用了一個async 方法,由於沒有返回值,也沒做任何處理,本地調試也OK,但一發佈到線上就有問題,微信公眾號關註成功,也有推送消息過來,但微信用戶一直保存不上,查看日誌會有個異常信息:
System.NotSupportedException: A second operation started on this context before a previous asynchronous operation completed. Use 'await' to ensure that any asynchronous operations have completed before calling another method on this context. Any instance members are not guaranteed to be thread safe.
2、 問題分析和解決方案
通過分析,主要問題是在async和await需成對出現,但我這裡是集成第三方微信框架,推送事件的方法並不能直接改成非同步方法,同時保存用戶數據的方法沒有返回結果,不能使用await。最後在官方github issue列表找到瞭解決方法,同步方法調用非同步方法AsyncHelper.RunSync,修改發佈後,該問題解決。
修改代碼如下:
public override void Subscribe(RequestMessageEvent_Subscribe requestMessage) { //獲取微信用戶信息 var wechatUser = Senparc.Weixin.MP.AdvancedAPIs.UserApi.Info(appId, requestMessage.FromUserName); //關註公眾號 AsyncHelper.RunSync(() => _wChatUserAppService.SubscribeAsync(requestMessage.FromUserName, wechatUser.nickname, wechatUser.headimgurl, requestMessage.EventKey, requestMessage.Ticket) ); }
參考官方github issue鏈接:
https://github.com/aspnetboilerplate/aspnetboilerplate/issues/3324