public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            StreamReader sr      = new StreamReader(HttpContext.Current.Request.InputStream);
            var          postStr = sr.ReadToEnd();

            HttpContext.Current.Request.InputStream.Seek(0, SeekOrigin.Begin);

            if (!string.IsNullOrEmpty(postStr))
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(postStr);

                XmlElement rootElement = doc.DocumentElement;

                WXReqModel model = new WXReqModel();
                model.XML          = postStr;
                model.ToUserName   = rootElement.SelectSingleNode("ToUserName").InnerText;
                model.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
                model.CreateTime   = rootElement.SelectSingleNode("CreateTime").InnerText;
                model.MsgType      = rootElement.SelectSingleNode("MsgType").InnerText;

                switch (model.MsgType)
                {
                case "text":
                    model.Content = rootElement.SelectSingleNode("Content").InnerText;
                    break;

                case "link":
                    model.Title       = rootElement.SelectSingleNode("Title").InnerText;
                    model.Description = rootElement.SelectSingleNode("Description").InnerText;
                    model.Url         = rootElement.SelectSingleNode("Url").InnerText;
                    break;

                case "location":
                    double Location_X, Location_Y; int Scale;
                    if (double.TryParse(rootElement.SelectSingleNode("Location_X").InnerText, out Location_X))
                    {
                        model.Location_X = Location_X;
                    }
                    if (double.TryParse(rootElement.SelectSingleNode("Location_Y").InnerText, out Location_Y))
                    {
                        model.Location_Y = Location_Y;
                    }
                    if (int.TryParse(rootElement.SelectSingleNode("Scale").InnerText, out Scale))
                    {
                        model.Scale = Scale;
                    }

                    model.Label = rootElement.SelectSingleNode("Label").InnerText;
                    break;

                case "image":
                    model.PicUrl  = rootElement.SelectSingleNode("PicUrl").InnerText;
                    model.MediaId = rootElement.SelectSingleNode("MediaId").InnerText;
                    break;

                case "voice":
                    model.PicUrl  = rootElement.SelectSingleNode("Format").InnerText;
                    model.MediaId = rootElement.SelectSingleNode("MediaId").InnerText;
                    try { model.Recongnition = rootElement.SelectSingleNode("Recongnition").InnerText; }
                    catch { }
                    break;

                case "video":
                    model.PicUrl  = rootElement.SelectSingleNode("ThumbMediaId").InnerText;
                    model.MediaId = rootElement.SelectSingleNode("MediaId").InnerText;
                    break;

                case "event":
                    model.EventKey = rootElement.SelectSingleNode("EventKey").InnerText;    //用于自定义菜单
                    model.Event    = rootElement.SelectSingleNode("Event").InnerText;
                    switch (model.Event)
                    {
                    case "LOCATION":
                        double lat, lng, pre;
                        double.TryParse(rootElement.SelectSingleNode("Latitude").InnerText, out lat);
                        double.TryParse(rootElement.SelectSingleNode("Longitude").InnerText, out lng);
                        double.TryParse(rootElement.SelectSingleNode("Precision").InnerText, out pre);
                        model.Latitude  = lat;
                        model.Longitude = lng;
                        model.Precision = pre;
                        break;

                    case "SCAN":
                    case "subscribe":
                        model.Ticket = rootElement.SelectSingleNode("Ticket").InnerText;
                        break;
                    }
                    break;
                }
                try
                {
                    model.MsgId = int.Parse(rootElement.SelectSingleNode("MsgId").InnerText);
                }
                catch { }

                return(model);
            }
            return(null);
        }
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            StreamReader sr = new StreamReader(HttpContext.Current.Request.InputStream);
            var postStr = sr.ReadToEnd();
            HttpContext.Current.Request.InputStream.Seek(0, SeekOrigin.Begin);

            if (!string.IsNullOrEmpty(postStr))
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(postStr);

                XmlElement rootElement = doc.DocumentElement;

                WXReqModel model = new WXReqModel();
                model.XML = postStr;
                model.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
                model.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
                model.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;
                model.MsgType = rootElement.SelectSingleNode("MsgType").InnerText;

                switch (model.MsgType)
                {
                    case "text":
                        model.Content = rootElement.SelectSingleNode("Content").InnerText;
                        break;
                    case "link":
                        model.Title = rootElement.SelectSingleNode("Title").InnerText;
                        model.Description = rootElement.SelectSingleNode("Description").InnerText;
                        model.Url = rootElement.SelectSingleNode("Url").InnerText;
                        break;
                    case "location":
                        double Location_X, Location_Y; int Scale;
                        if (double.TryParse(rootElement.SelectSingleNode("Location_X").InnerText, out Location_X))
                            model.Location_X = Location_X;
                        if (double.TryParse(rootElement.SelectSingleNode("Location_Y").InnerText, out Location_Y))
                            model.Location_Y = Location_Y;
                        if (int.TryParse(rootElement.SelectSingleNode("Scale").InnerText, out Scale))
                            model.Scale = Scale;

                        model.Label = rootElement.SelectSingleNode("Label").InnerText;
                        break;
                    case "image":
                        model.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;
                        model.MediaId = rootElement.SelectSingleNode("MediaId").InnerText;
                        break;
                    case "voice":
                        model.PicUrl = rootElement.SelectSingleNode("Format").InnerText;
                        model.MediaId = rootElement.SelectSingleNode("MediaId").InnerText;
                        try { model.Recongnition = rootElement.SelectSingleNode("Recongnition").InnerText; }
                        catch { }
                        break;
                    case "video":
                        model.PicUrl = rootElement.SelectSingleNode("ThumbMediaId").InnerText;
                        model.MediaId = rootElement.SelectSingleNode("MediaId").InnerText;
                        break;
                    case "event":
                        model.EventKey = rootElement.SelectSingleNode("EventKey").InnerText;//用于自定义菜单
                        model.Event = rootElement.SelectSingleNode("Event").InnerText;
                        switch (model.Event)
                        {
                            case "LOCATION":
                                double lat, lng, pre;
                                double.TryParse(rootElement.SelectSingleNode("Latitude").InnerText, out lat);
                                double.TryParse(rootElement.SelectSingleNode("Longitude").InnerText, out lng);
                                double.TryParse(rootElement.SelectSingleNode("Precision").InnerText, out pre);
                                model.Latitude = lat;
                                model.Longitude = lng;
                                model.Precision = pre;
                                break;
                            case "SCAN":
                            case "subscribe":
                                model.Ticket = rootElement.SelectSingleNode("Ticket").InnerText;
                                break;
                        }
                        break;
                }
                try
                {
                    model.MsgId = int.Parse(rootElement.SelectSingleNode("MsgId").InnerText);
                }
                catch { }

                return model;
            }
            return null;
        }
        public ActionResult Index(WXReqModel model)
        {
            var workContext = _orchardServices.WorkContext;
            var wxSettings = workContext.CurrentSite.As<WinXinSettingsPart>();

            if (model.ToUserName != wxSettings.UserName)
                return Content(string.Format(@"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{3}]]></Content>
</xml>
", model.FromUserName, model.ToUserName, _winXinService.ConvertWXDateTimeInt(DateTime.Now), T("微信平台对接错误,本平台不为此服务号或订阅号提供服务!")));

            string name = null;
            switch (model.MsgType)
            {
                case "text":
                    name = "微信文本消息";
                    break;
                case "image":
                    name = "微信图片消息";
                    break;
                case "voice":
                    name = "微信语音消息";
                    break;
                case "video":
                    name = "微信视频消息";
                    break;
                case "location":
                    name = "微信地理位置消息";
                    break;
                case "link":
                    name = "微信链接消息";
                    break;
                case "event":
                    name = "微信事件消息";
                    if (model.Event == "LOCATION")
                        name = "微信上报地理位置事件";
                    break;
                default:
                    throw new OrchardException(T(string.Format("未知的消息类型:{0}", model.MsgType)));
            }
            if (String.IsNullOrEmpty(Owner))
            {
                Owner = _siteService.GetSiteSettings().SuperUser;
            }
            var owner = _membershipService.GetUser(Owner);
            var msg = _contentManager.New("WeiXinMsg");
            msg.As<ICommonPart>().Owner = owner;
            var part = msg.As<WXMsgPart>();

            part.ToUserName = model.ToUserName;
            part.FromUserName = model.FromUserName;
            part.CreateTime = model.CreateTime;
            part.MsgType = model.MsgType;
            part.Content = model.Content;
            part.Location_X = model.Location_X;
            part.Location_Y = model.Location_Y;
            part.Scale = model.Scale;
            part.Label = model.Label;
            part.PicUrl = model.PicUrl;
            part.EventKey = model.EventKey;
            part.Event = model.Event;

            part.MsgId = model.MsgId;
            part.MediaId = model.MediaId;
            part.Format = model.Format;
            part.ThumbMediaId = model.ThumbMediaId;
            part.Title = model.Title;
            part.Description = model.Description;
            part.Url = model.Url;
            part.Ticket = model.Ticket;
            part.Latitude = model.Latitude;
            part.Longitude = model.Longitude;
            part.Precision = model.Precision;
            part.Recongnition = model.Recongnition;
            part.XML = model.XML;

            _contentManager.Create(msg);

            _workflowManager.TriggerEvent(name, msg, () => new Dictionary<string, object> { { "Content", msg } });

            var tupleList = _weiXinResp.List();
            var list = Shape.List(Attributes: new Dictionary<string, object> { 
                { "ToUserName", model.FromUserName } ,{ "FromUserName",model.ToUserName}
            });
            list.AddRange(tupleList.Select(t => _contentManager.BuildDisplay(t.Item1, "Detail")));

            var viewModel = Shape.ViewModel()
                .ContentItems(list);

            return View(viewModel);
        }