Esempio n. 1
0
        /// <summary>
        /// 处理事件推送
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        protected virtual IWRespBase DoForRequest_Event(WReqEventBase request)
        {
            switch (request.Event)
            {
            case EventType.Subscribe: return(DoForRequest_Event_Subscribe(Request as WReqEventSubscribe));

            case EventType.UnSubscribe: return(DoForRequest_Event_Unsubscribe(Request as WReqEventUnSubscribe));

            case EventType.Scan: return(DoForRequest_Event_Scan(Request as WReqEventScan));

            case EventType.Location: return(DoForRequest_Event_Location(Request as WReqEventLocation));

            case EventType.Click: return(DoForRequest_Event_Click(Request as WReqEventClick));

            case EventType.View: return(DoForRequest_Event_View(Request as WReqEventView));

            case EventType.Masssendjobfinish: return(DoForRequest_Event_MasssendJobFinish(Request as WReqEventMasssendJobFinish));

            case EventType.Card: return(DoForRequest_Event_Card(Request as WReqEventCard));

            default: return(DoForRequest_Event_Undefine(request));
            }
        }
Esempio n. 2
0
        public static IWReqBase GetRequestEntity(XDocument doc)
        {
            WReqBase request = null;

            try
            {
                if (doc.Root != null)
                {
                    var xElement = doc.Root.Element("MsgType");
                    if (xElement != null)
                    {
                        var msgType = EnumHelper.ParseEnum(xElement.Value, WReqType.Text);
                        switch (msgType)
                        {
                        case WReqType.Text:
                            request = new WReqText();
                            break;

                        case WReqType.Location:
                            request = new WReqLocation();
                            break;

                        case WReqType.Image:
                            request = new WReqImage();
                            break;

                        case WReqType.Voice:
                            request = new WReqVoice();
                            break;

                        case WReqType.Video:
                            request = new WReqVideo();
                            break;

                        case WReqType.Link:
                            request = new WReqLink();
                            break;

                        case WReqType.Event:        //判断Event类型
                            var eventElement = doc.Root.Element("Event");
                            if (eventElement != null)
                            {
                                var eventType = EnumHelper.ParseEnum(eventElement.Value, EventType.UnDefine);
                                switch (eventType)
                                {
                                case EventType.Subscribe:        //订阅(关注)
                                    request = new WReqEventSubscribe();
                                    break;

                                case EventType.UnSubscribe:        //取消订阅(关注)
                                    request = new WReqEventUnSubscribe();
                                    break;

                                case EventType.Scan:        //二维码扫描
                                    request = new WReqEventScan();
                                    break;

                                case EventType.Click:        //菜单点击
                                    request = new WReqEventClick();
                                    break;

                                case EventType.View:        //Url跳转
                                    request = new WReqEventView();
                                    break;

                                case EventType.Location:        //地理位置上报
                                    request = new WReqEventLocation();
                                    break;

                                case EventType.Masssendjobfinish:
                                    request = new WReqEventMasssendJobFinish();
                                    break;

                                case EventType.UnDefine: {
                                    if (eventElement.Value.ToLower().Contains("card"))
                                    {
                                        WReqEventCard cardRequest = new WReqEventCard();
                                        cardRequest.EventKey = eventElement.Value.ToLower();
                                        request = cardRequest;
                                        doc.Root.Element("Event").SetValue("Card");
                                        break;
                                    }
                                    request = new WReqEventBase();
                                    //LogServices.WriteTxtLogEx("WRequestFactory", "未定义的Event{0},Xml:{1}", eventElement.Value, doc.ToString());
                                    break;
                                }

                                default:         //其他意外类型(也可以选择抛出异常)
                                    request = new WReqEventBase();
                                    //LogServices.WriteTxtLogEx("WRequestFactory", "未定义的Event{0},Xml:{1}", eventElement.Value, doc.ToString());
                                    break;
                                }
                            }
                            break;

                        default:
                            //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
                            //LogServices.WriteTxtLogEx("WRequestFactory", "未定义的MsgType{0},Xml:{1}", xElement.Value, doc.ToString());
                            throw new Exception(string.Format("MsgType:{0} 在RequestFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException());
                        }
                        request.FillWithXml(doc);
                    }
                }
            }
            catch (ArgumentException ex)
            {
                throw new Exception(string.Format("Request转换出错!可能是MsgType不存在!,XML:{0} ,错误信息:{1}", doc.ToString(SaveOptions.None), ex.Message), ex);
            }
            return(request);
        }
Esempio n. 3
0
 /// <summary>
 /// 处理事件推送--群发回执
 /// </summary>
 /// <param name="request"></param>
 /// <returns></returns>
 protected virtual IWRespBase DoForRequest_Event_MasssendJobFinish(WReqEventBase request)
 {
     return(null);
 }
Esempio n. 4
0
 /// <summary>
 /// 处理事件推送--未定义
 /// </summary>
 /// <param name="request"></param>
 /// <returns></returns>
 protected virtual IWRespBase DoForRequest_Event_Undefine(WReqEventBase request)
 {
     return(null);
 }
Esempio n. 5
0
        /// <summary>
        /// 执行微信请求
        /// </summary>
        public void Execute()
        {
            if (CancelExcute)
            {
                return;
            }

            OnExecuting();

            if (CancelExcute)
            {
                return;
            }


            if (Request == null)
            {
                return;
            }

            //重复推送信息处理,缓存回复30秒
            var key   = string.Format("xNet_Wx_Cache_{0}_{1}_{2}", Request.FromUserName, Request.CreateTime, Request.MsgId);
            var cache = HttpRuntime.Cache[key];

            if (cache != null)
            {
                Response = cache as IWRespBase;
                return;
            }
            try
            {
                var enterkey = CheckGetEnterKey();
                if (!string.IsNullOrWhiteSpace(enterkey))
                {
                    Response = DoForRequest_Enter(enterkey);
                }
                if (Response == null)
                {
                    switch (Request.MsgType)
                    {
                    case WReqType.Text:
                        var wReqText = Request as WReqText;
                        Response = DoForRequest_Text(wReqText);
                        break;

                    case WReqType.Location:
                        Response = DoForRequest_Location(Request as WReqLocation);
                        break;

                    case WReqType.Image:
                        Response = DoForRequest_Image(Request as WReqImage);
                        break;

                    case WReqType.Voice:
                        Response = DoForRequest_Voice(Request as WReqVoice);
                        break;

                    case WReqType.Link:
                        Response = DoForRequest_Link(Request as WReqLink);
                        break;

                    case WReqType.Video:
                        Response = DoForRequest_Video(Request as WReqVideo);
                        break;

                    case WReqType.Event:
                        Response = DoForRequest_Event(Request as WReqEventBase);
                        break;

                    default:
                        throw new Exception("未知的MsgType请求类型", null);
                    }
                }
                if (Response == null)
                {
                    bool needRequestDefault = true;
                    if (Request.MsgType == WReqType.Event)  //上报地理位置 不需要默认回复
                    {
                        WReqEventBase wreqevent = Request as WReqEventBase;
                        if (wreqevent != null && wreqevent.Event == EventType.Location)
                        {
                            needRequestDefault = false;
                        }
                    }
                    if (needRequestDefault)
                    {
                        Response = DoForRequest_Default(Request as WReqBase);
                    }
                }
                if (Response != null)
                {
                    HttpRuntime.Cache.Insert(key, Response, null, DateTime.Now.AddSeconds(30), Cache.NoSlidingExpiration);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Execute Root:" + ex.Message);
            }
            finally
            {
                OnExecuted();
            }
        }