public void GetRequestEntityTest()
        {
            var dt = DateTimeHelper.BaseTime.AddTicks(((long)1413192605 + 8 * 60 * 60) * 10000000);
            {
                //component_verify_ticket
                var doc    = XDocument.Parse(component_verify_ticketText);
                var result = RequestMessageFactory.GetRequestEntity(doc);
                Assert.IsInstanceOfType(result, typeof(RequestMessageComponentVerifyTicket));
                Assert.AreEqual("1", result.AppId);
                Assert.AreEqual(dt, result.CreateTime);
                Assert.AreEqual("ChainClouds", (result as RequestMessageComponentVerifyTicket).ComponentVerifyTicket);
                Console.WriteLine(doc);
            }

            {
                //unauthorized
                var doc    = XDocument.Parse(unauthorizedText);
                var result = RequestMessageFactory.GetRequestEntity(doc);
                Assert.IsInstanceOfType(result, typeof(RequestMessageUnauthorized));
                Assert.AreEqual("1", result.AppId);
                Assert.AreEqual(dt, result.CreateTime);
                Assert.AreEqual("211", (result as RequestMessageUnauthorized).AuthorizerAppid);
                Console.WriteLine(doc);
            }
        }
Exemple #2
0
        public void ConvertEntityToXml_MusicTest()
        {
            var voiceTest     = @"<?xml version=""1.0"" encoding=""utf-8""?>
<xml>
  <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName>
  <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName>
  <CreateTime>1361430302</CreateTime>
  <MsgType><![CDATA[voice]]></MsgType>
  <MediaId><![CDATA[X1yfgB2XI-faU6R2jmKz0X1JZmPCxIvM-9ktt4K92BB9577SCi41S-qMl60q5DJo]]></MediaId>
  <Format><![CDATA[amr]]></Format>
  <MsgId>5847298622973403529</MsgId>
</xml>";
            var doc           = XDocument.Parse(voiceTest);
            var requestEntity = RequestMessageFactory.GetRequestEntity(doc) as RequestMessageVoice;

            Assert.IsNotNull(requestEntity);

            var responseMusic =
                ResponseMessageBase.CreateFromRequestMessage <ResponseMessageMusic>(requestEntity);

            Assert.IsNotNull(responseMusic);

            responseMusic.Music.Title       = "测试Music";
            responseMusic.Music.Description = "测试Music的说明";
            responseMusic.Music.MusicUrl    = "http://zs.sasu.edu.cn/Content/music1.mp3";
            responseMusic.Music.HQMusicUrl  = "http://zs.sasu.edu.cn/Content/music2.mp3";

            var responseDoc = EntityHelper.ConvertEntityToXml(responseMusic);

            Console.WriteLine(responseDoc.ToString());
            Assert.AreEqual(responseMusic.Music.Title, responseDoc.Root.Element("Music").Element("Title").Value);
            Assert.AreEqual(responseMusic.Music.Description, responseDoc.Root.Element("Music").Element("Description").Value);
            Assert.AreEqual(responseMusic.Music.MusicUrl, responseDoc.Root.Element("Music").Element("MusicUrl").Value);
            Assert.AreEqual(responseMusic.Music.HQMusicUrl, responseDoc.Root.Element("Music").Element("HQMusicUrl").Value);
        }
Exemple #3
0
 public async Task <ActionResult> WXMSG(string signature, string timestamp, string nonce, string echostr)
 {
     if (!CheckSignature.Check(signature, timestamp, nonce, Commons.WXToken))
     {
         return(Content("参数错误!"));
     }
     try
     {
         XDocument requestDoc = null;
         requestDoc = XDocument.Load(Request.Body);
         var requestMessage = RequestMessageFactory.GetRequestEntity(requestDoc);
         // 关注 取消 事件
         if (requestMessage.MsgType == RequestMsgType.Event)
         {
             RequestMessageEventBase msg = (RequestMessageEventBase)requestMessage;
             if (msg.Event == Event.subscribe)
             {
                 await FocusOn(requestDoc);  //关注
             }
             if (msg.Event == Event.unsubscribe)
             {
                 await UnFocusOn(requestDoc); //取消关注
             }
         }
         else
         {
             await AcceptWechar(requestDoc);// 发送的消息
         }
         return(Content("success"));
     }
     catch (Exception ex)
     {
         return(Content(ex.ToString()));
     }
 }
Exemple #4
0
        public XDocument Init(IEncryptPostModel postModel)
        {
            _postModel = postModel as PostModel ?? new PostModel();

            //解密XML信息
            var postDataStr = EcryptRequestDocument.ToString();

            WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.AppId);
            string        msgXml   = null;
            var           result   = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml);

            //判断result类型
            if (result != 0)
            {
                //验证没有通过,取消执行
                CancelExecute = true;
                return(null);
            }

            RequestDocument = XDocument.Parse(msgXml);//完成解密
            RequestMessage  = RequestMessageFactory.GetRequestEntity(RequestDocument);

            //((RequestMessageBase)RequestMessage).FillEntityWithXml(RequestDocument);

            return(RequestDocument);
        }
Exemple #5
0
        public void ConvertEntityToXml_ImageTest()
        {
            {
                var imageRequestXML = @"<?xml version=""1.0"" encoding=""utf-8""?>
<xml>
  <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName>
  <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName>
  <CreateTime>1357996976</CreateTime>
  <MsgType><![CDATA[image]]></MsgType>
  <PicUrl><![CDATA[http://mmsns.qpic.cn/mmsns/ZxBXNzgHyUqazGkXUvujSOOHruk6XP5P9984HOCSATlW1orZDlpdCA/0]]></PicUrl>
  <MsgId>5832552599987382826</MsgId>
  <MediaId><![CDATA[Mj0WUTZeeG9yuBKhGP7iR5n1xUJO9IpTjGNC4buMuswfEOmk6QSIRb_i98do5nwo]]></MediaId>
</xml>";
                var doc             = XDocument.Parse(imageRequestXML);
                var requestEntity   =
                    RequestMessageFactory.GetRequestEntity(new MessageContexts.DefaultMpMessageContext(), doc) as
                    RequestMessageImage;
                Assert.IsNotNull(requestEntity);

                //var responseNews =
                //        ResponseMessageBase.CreateFromRequestMessage(requestEntity, ResponseMsgType.News) as
                //        ResponseMessageNews;
                //Assert.IsNotNull(responseNews);

                //responseNews.Articles.Add(new Article()
                //{
                //    Description = "测试说明",
                //    Title = "测试标题",
                //    Url = "http://www.senparc.com",
                //    PicUrl = requestEntity.PicUrl
                //});
                //Assert.AreEqual(1, responseNews.ArticleCount);

                //var responseDoc = EntityHelper.ConvertEntityToXml(responseNews);
                //Console.WriteLine(responseDoc.ToString());
                //Assert.AreEqual(requestEntity.PicUrl, responseDoc.Root.Element("Articles").Elements("item").First().Element("PicUrl").Value);


                //返回图片信息
                var responseMessage = ResponseMessageBase.CreateFromRequestMessage <ResponseMessageImage>(requestEntity);
                responseMessage.Image.MediaId = requestEntity.MediaId;
                var responseDoc = EntityHelper.ConvertEntityToXml(responseMessage);
                Assert.IsNotNull(responseDoc);
            }

            //            {
            //                var imageResponseXML = @"<?xml version=""1.0"" encoding=""utf-8""?>
            //<xml>
            //  <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName>
            //<FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName>
            //<CreateTime>1392354263</CreateTime>
            //<MsgType><![CDATA[image]]></MsgType>
            //<PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/ZxBXNzgHyUqDOeR0nSWZ4ibeF49C2yBbUB9tltJaFLqvjvDOUkt1tgp3q2cr1KZMLRsHHA2380sAggSPRuRMjicQ/0]]></PicUrl>
            //<MsgId>5980116024231210973</MsgId>
            //<MediaId><![CDATA[Mj0WUTZeeG9yuBKhGP7iR5n1xUJO9IpTjGNC4buMuswfEOmk6QSIRb_i98do5nwo]]></MediaId>
            //</xml>";
            //            }
        }
Exemple #6
0
        public void FillEntityWithXmlTest()
        {
            var doc    = XDocument.Parse(xml);
            var entity = RequestMessageFactory.GetRequestEntity(doc);

            EntityHelper.FillEntityWithXml(entity as RequestMessageBase, doc);

            Assert.AreEqual("gh_a96a4a619366", entity.ToUserName);
            Assert.AreEqual(RequestMsgType.Text, entity.MsgType);
        }
        public override XDocument Init(XDocument postDataDocument, object postData = null)
        {
            //进行加密判断并处理
            _postModel = postData as PostModel;
            var postDataStr = postDataDocument.ToString();

            AfterDecryptData(postDataStr, _postModel);

            XDocument decryptDoc = postDataDocument;
            XElement  AppID      = postDataDocument.Root.Element("ToUserName");

            AfterGetData(AppID == null ? "" : AppID.Value, _postModel);

            if (_postModel != null && postDataDocument.Root.Element("Encrypt") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("Encrypt").Value))
            {
                //使用了加密
                UsingEcryptMessage    = true;
                EcryptRequestDocument = postDataDocument;

                WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.AppId);
                string        msgXml   = null;
                var           result   = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml);

                //判断result类型
                if (result != 0)
                {
                    //验证没有通过,取消执行
                    CancelExcute = true;
                    return(null);
                }

                if (postDataDocument.Root.Element("FromUserName") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("FromUserName").Value))
                {
                    //TODO:使用了兼容模式,进行验证即可
                    UsingCompatibilityModelEcryptMessage = true;
                }

                decryptDoc = XDocument.Parse(msgXml);//完成解密
            }

            RequestMessage = RequestMessageFactory.GetRequestEntity(decryptDoc);
            if (UsingEcryptMessage)
            {
                RequestMessage.Encrypt = postDataDocument.Root.Element("Encrypt").Value;
            }


            //记录上下文
            if (WeixinContextGlobal.UseWeixinContext)
            {
                WeixinContext.InsertMessage(RequestMessage);
            }

            return(decryptDoc);
        }
Exemple #8
0
        public RequestMessageFactoryTests()
        {
            _request = new Request
            {
                Method = "GET",
                Url    = "/users/123",
                Body   = new byte[] { 123 }
            };

            _underTest = new RequestMessageFactory();
        }
Exemple #9
0
        public override async Task <InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (encoding == null)
            {
                throw new ArgumentNullException(nameof(encoding));
            }

            if (context.ModelType == typeof(RequestMessage))
            {
                var request = context.HttpContext.Request;
                if (!request.Body.CanSeek)
                {
                    BufferingHelper.EnableRewind(request);
                    Debug.Assert(request.Body.CanSeek);

                    await request.Body.DrainAsync(CancellationToken.None);

                    request.Body.Seek(0L, SeekOrigin.Begin);
                }

                using (var xmlReader = CreateXmlReader(new NonDisposableStream(request.Body), encoding))
                {
                    var inputRequestMessage = RequestMessageFactory.CreateRequestMessage(xmlReader);

                    if ((_messageMode == MessageMode.Cipher || _messageMode == MessageMode.Compatible) &&
                        inputRequestMessage is RequestEncryptMessage)
                    {
                        var encryptMessage = inputRequestMessage as RequestEncryptMessage;
                        var plainMessage   = String.Empty;
                        var sMsgSignature  = context.HttpContext.Request.Query["msg_signature"];
                        var sTimeStamp     = context.HttpContext.Request.Query["timestamp"];
                        var sNonce         = context.HttpContext.Request.Query["nonce"];
                        var ret            = _crypt.DecryptMsg(sMsgSignature, sTimeStamp, sNonce, encryptMessage.EncryptMessage, ref plainMessage);
                        if (ret == 0)
                        {
                            using (var stringStream = new MemoryStream(encoding.GetBytes(plainMessage)))
                                using (var stringReader = CreateXmlReader(stringStream, encoding))
                                {
                                    inputRequestMessage = RequestMessageFactory.CreateRequestMessage(stringReader);
                                }
                        }
                    }

                    return(InputFormatterResult.Success(inputRequestMessage));
                }
            }

            return(await base.ReadRequestBodyAsync(context, encoding));
        }
Exemple #10
0
        private void Init(XDocument requestDocument)
        {
            RequestDocument = requestDocument;
            RequestMessage  = RequestMessageFactory.GetRequestEntity(RequestDocument);

            //记录上下文
            if (WeixinContextGlobal.UseWeixinContext)
            {
                //WeixinContext.InsertMessage(RequestMessage);
            }
        }
Exemple #11
0
        public override XDocument Init(XDocument postDataDocument, object postData = null)
        {
            RequestMessage = RequestMessageFactory.GetRequestEntity(postDataDocument);

            //记录上下文
            if (WeixinContextGlobal.UseWeixinContext)
            {
                WeixinContext.InsertMessage(RequestMessage);
            }

            return(postDataDocument);
        }
Exemple #12
0
        public IActionResult Post([FromServices] IOptions <AppSetting> appSettings, WechatPostRequestModel model)
        {
            if (!CheckSignature.Check(model.signature, model.timestamp, model.nonce, appSettings.Value.Token))
            {
                return(Content("参数错误!"));
            }
            var doc            = XDocument.Load(Request.Body);
            var requestMessage = RequestMessageFactory.GetRequestEntity(doc);

            try
            {
                var baseMessage = ResponseMessageBase.CreateFromRequestMessage <IResponseMessageBase>(requestMessage);
                var responseDoc = Senparc.NeuChar.Helpers.EntityHelper.ConvertEntityToXml(baseMessage);
                var responseStr = responseDoc.ToString();
                switch (requestMessage.MsgType)
                {
                case RequestMsgType.Text:
                    break;

                case RequestMsgType.Location:
                    break;

                case RequestMsgType.Image:
                    break;

                case RequestMsgType.Voice:
                    break;

                case RequestMsgType.Video:
                    break;

                case RequestMsgType.Link:
                    break;

                case RequestMsgType.ShortVideo:
                    break;

                case RequestMsgType.Event:
                    //responseStr = await wechatEvent.HandleAsync(doc);
                    break;

                default:
                    break;
                }
                return(Content(responseStr));
            }
            catch (Exception ex)
            {
                ex.ToExceptionless();
                //LogManager.GetCurrentClassLogger().Error($"Exception:{ex}\n,Doc:{doc}");
                return(Content(model.echostr));
            }
        }
        public override XDocument Init(XDocument postDataDocument, IEncryptPostModel postModel)
        {
            _postModel = postModel as PostModel ?? new PostModel();

            var postDataStr = postDataDocument.ToString();

            //Work中消息默认都是强制加密的,但通知似乎没有加密
            UsingEncryptMessage = postDataDocument.Root.Element("Encrypt") != null;

            EncryptPostData = RequestMessageFactory.GetEncryptPostData(postDataStr);

            XDocument requestDocument;

            //2、解密:获得明文字符串
            if (UsingEncryptMessage)
            {
                string msgXml = null;

                WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.CorpId);
                var           result   = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml);

                /* msgXml
                 * <xml><ToUserName><![CDATA[wx7618c0a6d9358622]]></ToUserName>
                 * <FromUserName><![CDATA[001]]></FromUserName>
                 * <CreateTime>1412585107</CreateTime>
                 * <MsgType><![CDATA[text]]></MsgType>
                 * <Content><![CDATA[你好]]></Content>
                 * <MsgId>4299263624800632834</MsgId>
                 * <AgentID>2</AgentID>
                 * </xml>
                 */

                //判断result类型
                if (result != 0)
                {
                    //验证没有通过,取消执行
                    CancelExecute = true;
                    return(null);
                }

                requestDocument = XDocument.Parse(msgXml);
            }
            else
            {
                requestDocument = postDataDocument;//TODO:深拷贝
            }

            RequestMessage = RequestMessageFactory.GetRequestEntity <TMC>(new TMC(), doc: requestDocument);

            return(requestDocument);

            //消息上下文记录将在 base.CommonInitialize() 中根据去重等条件判断后进行添加
        }
Exemple #14
0
        private async Task <Response> SendAsync(Request request, TimeSpan?connectionTimeout, CancellationToken token)
        {
            try
            {
                using (var state = new DisposableState())
                {
                    state.Request = RequestMessageFactory.Create(request, token, log);
                    if (state.Request.Content is GenericContent content && socketTuner.CanTune)
                    {
                        state.Request.Content = new SocketTuningContent(content, socketTuner, log);
                    }

                    var handler = handlerProvider.Obtain(connectionTimeout);

                    state.Response = await SocketsHandlerInvoker.Invoke(handler, state.Request, token).ConfigureAwait(false);

                    var responseCode    = (ResponseCode)(int)state.Response.StatusCode;
                    var responseHeaders = ResponseHeadersConverter.Convert(state.Response);

                    if (request.Method == RequestMethods.Head)
                    {
                        return(new Response(responseCode, headers: responseHeaders));
                    }

                    var bodyReadResult = await bodyReader.ReadAsync(state.Response, token).ConfigureAwait(false);

                    if (bodyReadResult.ErrorCode.HasValue)
                    {
                        return(new Response(bodyReadResult.ErrorCode.Value));
                    }

                    if (bodyReadResult.Stream == null)
                    {
                        return(new Response(responseCode, bodyReadResult.Content, responseHeaders));
                    }

                    state.PreventNextDispose();

                    return(new Response(responseCode, null, responseHeaders, new DisposableBodyStream(bodyReadResult.Stream, state)));
                }
            }
            catch (Exception error)
            {
                var errorResponse = errorHandler.TryHandle(request, error, token, connectionTimeout);
                if (errorResponse == null)
                {
                    throw;
                }

                return(errorResponse);
            }
        }
        /// <summary>
        /// 初始化数据
        /// </summary>
        /// <param name="postDataDocument"></param>
        /// <param name="postModel"></param>
        /// <returns></returns>
        public override XDocument Init(XDocument postDataDocument, IEncryptPostModel postModel)
        {
            //进行加密判断并处理
            _postModel = postModel as PostModel ?? new PostModel();
            var postDataStr = postDataDocument.ToString();

            XDocument decryptDoc = postDataDocument;

            if (_postModel != null && !_postModel.Token.IsNullOrWhiteSpace() &&
                postDataDocument.Root.Element("Encrypt") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("Encrypt").Value))
            {
                //使用了加密
                UsingEcryptMessage    = true;
                EcryptRequestDocument = postDataDocument;

                WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.AppId);
                string        msgXml   = null;
                var           result   = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml);

                //判断result类型
                if (result != 0)
                {
                    //验证没有通过,取消执行
                    CancelExcute = true;
                    return(null);
                }

                if (postDataDocument.Root.Element("FromUserName") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("FromUserName").Value))
                {
                    //TODO:使用了兼容模式,进行验证即可
                    UsingCompatibilityModelEcryptMessage = true;
                }

                decryptDoc = XDocument.Parse(msgXml);//完成解密
            }

            RequestMessage = RequestMessageFactory.GetRequestEntity(new TMC(), decryptDoc);
            if (UsingEcryptMessage)
            {
                RequestMessage.Encrypt = postDataDocument.Root.Element("Encrypt").Value;
            }

            //记录上下文
            if (MessageContextGlobalConfig.UseMessageContext)
            {
                GlobalMessageContext.InsertMessage(RequestMessage);
            }

            return(decryptDoc);
        }
Exemple #16
0
        public void GetEncryptPostDataTest()
        {
            var xml             = @"<xml>
<ToUserName><![CDATA[wx7618c0a6d9358622]]></ToUserName>
<Encrypt><![CDATA[P/xe9JLq4RJd3AFnjwRsttpyBrTVAGZ49JspjVI65EL7ra73u5TNn3EXHngx1TQ1gnfuFpbRovJdVZ8WrqZ4y0PI9ncA9GR95TboQWK/RGbDpW/Rkq0il1lpw+c/NTk1abwH1C/2siKATSJTbGQ4mWSyhOME7vINBHeW7EjmGEZSaPxC60z1qcLYgMYAiEL/xrU484V6X6BG/jV2uF76+C7HWGMLVmu4DOHVW+UfqQo9SnpAqZx0KRcvT/8XxGUsGwgNWhYyuzUHxu1VuZK16IiHS494tjWrXs08dKQzcpwyID7dthqQDTdIVe0tiOwPAlXvv7jQ5iMtYoQlT32HOjNTn5o/hz9wFZNnC6TFi2Y0ocEWxEMNwDHsyK85ytryTZzL+OmZ7heB72ABNhx9uGhrLoA5M68/ZXwlmfJVx8M=]]></Encrypt>
<AgentID><![CDATA[2]]></AgentID>
</xml>";
            var encryptPostData = RequestMessageFactory.GetEncryptPostData(xml);

            Assert.IsNotNull(encryptPostData);
            Assert.AreEqual("wx7618c0a6d9358622", encryptPostData.ToUserName);
            Assert.AreEqual("P/xe9JLq4RJd3AFnjwRsttpyBrTVAGZ49JspjVI65EL7ra73u5TNn3EXHngx1TQ1gnfuFpbRovJdVZ8WrqZ4y0PI9ncA9GR95TboQWK/RGbDpW/Rkq0il1lpw+c/NTk1abwH1C/2siKATSJTbGQ4mWSyhOME7vINBHeW7EjmGEZSaPxC60z1qcLYgMYAiEL/xrU484V6X6BG/jV2uF76+C7HWGMLVmu4DOHVW+UfqQo9SnpAqZx0KRcvT/8XxGUsGwgNWhYyuzUHxu1VuZK16IiHS494tjWrXs08dKQzcpwyID7dthqQDTdIVe0tiOwPAlXvv7jQ5iMtYoQlT32HOjNTn5o/hz9wFZNnC6TFi2Y0ocEWxEMNwDHsyK85ytryTZzL+OmZ7heB72ABNhx9uGhrLoA5M68/ZXwlmfJVx8M=", encryptPostData.Encrypt);
            Assert.AreEqual(2, encryptPostData.AgentID);
        }
Exemple #17
0
        public override XDocument Init(XDocument postDataDocument, object postData)
        {
            _postModel = postData as PostModel;

            var postDataStr = postDataDocument.ToString();

            AfterDecryptData(postDataStr, _postModel);

            EncryptPostData = RequestMessageFactory.GetEncryptPostData(postDataStr);

            AfterGetData(EncryptPostData, _postModel);

            //解密:获得明文字符串
            WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.CorpId);
            string        msgXml   = null;
            var           result   = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml);

            /* msgXml
             *  <xml><ToUserName><![CDATA[wx7618c0a6d9358622]]></ToUserName>
             *  <FromUserName><![CDATA[001]]></FromUserName>
             *  <CreateTime>1412585107</CreateTime>
             *  <MsgType><![CDATA[text]]></MsgType>
             *  <Content><![CDATA[你好]]></Content>
             *  <MsgId>4299263624800632834</MsgId>
             *  <AgentID>2</AgentID>
             *  </xml>
             */

            //判断result类型
            if (result != 0)
            {
                //验证没有通过,取消执行
                CancelExcute = true;
                return(null);
            }

            AfterDecryptData(msgXml, _postModel);

            var requestDocument = XDocument.Parse(msgXml);

            RequestMessage = RequestMessageFactory.GetRequestEntity(requestDocument);

            //记录上下文,Chat还是不记录吧,太多了
            if (WeixinContextGlobal.UseWeixinContext && !(RequestMessage is RequestMessageChat))
            {
                WeixinContext.InsertMessage(RequestMessage);
            }

            return(requestDocument);
        }
Exemple #18
0
        protected virtual void DecryptMsg()
        {
            if (this.SignModel != null && !string.IsNullOrEmpty(this.SignModel.msg_signature))
            {
                MsgCryptUtility mc         = new MsgCryptUtility(WeiXinContext.Config.Token, WeiXinContext.Config.EncodingAESKey, WeiXinContext.Config.AppID);
                var             requestXml = this.RequestXml;

                var ret = mc.DecryptMsg(this.SignModel.msg_signature, this.SignModel.timestamp, this.SignModel.nonce, requestXml, ref requestXml);
                if (ret != 0)
                {
                    throw new Exception("消息解密失败");
                }
                this.RequestXml = requestXml;
            }
            this.RequestMessage = RequestMessageFactory.GetRequestEntity(this.RequestXml);
        }
        public override XDocument Init(XDocument postDataDocument, IEncryptPostModel postModel)
        {
            _postModel = postModel as PostModel ?? new PostModel();


            UsingEcryptMessage = true;//Work中消息都是强制加密的
            var postDataStr = postDataDocument.ToString();

            EncryptPostData = RequestMessageFactory.GetEncryptPostData(postDataStr);

            //2、解密:获得明文字符串
            WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.CorpId);
            string        msgXml   = null;
            var           result   = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml);

            /* msgXml
             * <xml><ToUserName><![CDATA[wx7618c0a6d9358622]]></ToUserName>
             * <FromUserName><![CDATA[001]]></FromUserName>
             * <CreateTime>1412585107</CreateTime>
             * <MsgType><![CDATA[text]]></MsgType>
             * <Content><![CDATA[你好]]></Content>
             * <MsgId>4299263624800632834</MsgId>
             * <AgentID>2</AgentID>
             * </xml>
             */

            //判断result类型
            if (result != 0)
            {
                //验证没有通过,取消执行
                CancelExcute = true;
                return(null);
            }

            var requestDocument = XDocument.Parse(msgXml);

            RequestMessage = RequestMessageFactory.GetRequestEntity(requestDocument);

            //记录上下文
            if (RequestMessage.MsgType != RequestMsgType.Unknown && MessageContextGlobalConfig.UseMessageContext)
            {
                GlobalMessageContext.InsertMessage(RequestMessage);
            }

            return(requestDocument);
        }
Exemple #20
0
        public void FillEntityWithEmbedXmlTest()
        {
            var doc    = XDocument.Parse(embedXml);
            var entity = RequestMessageFactory.GetRequestEntity(doc);

            EntityHelper.FillEntityWithXml(entity as RequestMessageBase, doc);

            Assert.AreEqual("gh_4d00ed8d6399", entity.ToUserName);
            Assert.AreEqual(RequestMsgType.Event, entity.MsgType);

            var strongEntity = entity as RequestMessageEvent_MassSendJobFinish;

            Assert.IsNotNull(strongEntity);
            Assert.AreEqual(2, strongEntity.CopyrightCheckResult.Count);
            Assert.AreEqual("Url_1", strongEntity.CopyrightCheckResult.ResultList[0].item.OriginalArticleUrl);
            Assert.AreEqual("Url_2", strongEntity.CopyrightCheckResult.ResultList[1].item.OriginalArticleUrl);
        }
Exemple #21
0
        public void ConvertEntityToXml_subscribe_msg_sent_eventTest()
        {
            var xml = @"<xml>
    <ToUserName><![CDATA[gh_123456789abc]]></ToUserName>
    <FromUserName><![CDATA[otFpruAK8D-E6EfStSYonYSBZ8_4]]></FromUserName>
    <CreateTime>1610969468</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[subscribe_msg_sent_event]]></Event>
    <SubscribeMsgSentEvent>
        <List>
            <TemplateId><![CDATA[VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc]]></TemplateId>
            <MsgID>1700827132819554304</MsgID>
            <ErrorCode>0</ErrorCode>
            <ErrorStatus><![CDATA[success]]></ErrorStatus>
        </List>
    </SubscribeMsgSentEvent>
</xml>";

            var doc           = XDocument.Parse(xml);
            var requestEntity =
                RequestMessageFactory.GetRequestEntity(new MessageContexts.DefaultMpMessageContext(), doc) as
                RequestMessageEvent_Subscribe_Msg_Sent;


            Assert.IsNotNull(requestEntity);


            Assert.IsTrue(requestEntity.Event.ToString() == "subscribe_msg_sent_event");

            Assert.IsTrue(requestEntity.FromUserName == "otFpruAK8D-E6EfStSYonYSBZ8_4");
            Assert.IsTrue(requestEntity.SubscribeMsgSentEvent.Count == 1);

            Assert.IsTrue(requestEntity.SubscribeMsgSentEvent[0].TemplateId ==
                          "VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc");

            Assert.IsTrue(requestEntity.SubscribeMsgSentEvent[0].MsgID ==
                          "1700827132819554304");


            Assert.IsTrue(requestEntity.SubscribeMsgSentEvent[0].ErrorCode == 0);


            Assert.IsTrue(requestEntity.SubscribeMsgSentEvent[0].ErrorStatus == "success");
        }
Exemple #22
0
        public override XDocument Init(XDocument requestDocument, IEncryptPostModel postModel)
        {
            XDocument decryptDoc     = requestDocument;
            var       messageContext = new Weixin.MP.MessageContexts.DefaultMpMessageContext();// new CustomMessageContext(); //base.GetCurrentMessageContext().GetAwaiter().GetResult();

            RequestMessage = RequestMessageFactory.GetRequestEntity(messageContext, decryptDoc) as RequestMessageBase;

            base.SpecialDeduplicationAction = (lastMessage, messageHandler) =>
            {
                //判断特殊事件
                if (!messageHandler.MessageIsRepeated &&
                    lastMessage is RequestMessageEventBase &&
                    messageHandler.RequestMessage is RequestMessageEventBase &&
                    (lastMessage as RequestMessageEventBase).Event == (messageHandler.RequestMessage as RequestMessageEventBase).Event
                    )
                {
                    var lastEventMessage    = lastMessage as RequestMessageEventBase;
                    var currentEventMessage = messageHandler.RequestMessage as RequestMessageEventBase;
                    switch (lastEventMessage.Event)
                    {
                    case Event.user_get_card:     //领取事件推送
                                                  //文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025274
                                                  //问题反馈:https://github.com/JeffreySu/WeiXinMPSDK/issues/1106
                        var lastGetUserCardMessage    = lastMessage as RequestMessageEvent_User_Get_Card;
                        var currentGetUserCardMessage = messageHandler.RequestMessage as RequestMessageEvent_User_Get_Card;
                        if (lastGetUserCardMessage.UserCardCode == currentGetUserCardMessage.UserCardCode &&
                            lastGetUserCardMessage.CardId == currentGetUserCardMessage.CardId)
                        {
                            return(true);
                        }
                        break;

                    default:
                        break;
                    }
                }
                return(false);
            };

            //消息去重的基本方法已经在基类 CommonInitialize() 中实现

            return(decryptDoc);
        }
Exemple #23
0
        /// <summary>
        /// 分析微信POST到本服务器的XML数据
        /// </summary>
        /// <param name="xmlStream"></param>
        /// <returns></returns>
        private string AnalyzeXmlFromWeiXin(HttpContext context)
        {
            try
            {
                var xmlMsg = RequestMessageFactory.GetRequestEntity(context.Request.InputStream);
                switch (xmlMsg.MsgType)
                {
                case RequestMsgType.Event:    //如果是事件
                    return(OnAttention((RequestMessageEventBase)xmlMsg));

                default:
                    return("");
                }
            }
            catch (Exception ex)
            {
                return("分析微信POST到本服务器的XML数据 出错");
            }
        }
Exemple #24
0
        public void ConvertEntityToXml_subscribe_msg_popup_eventTest()
        {
            var xml           = @"<xml>
    <ToUserName><![CDATA[gh_123456789abc]]></ToUserName>
    <FromUserName><![CDATA[otFpruAK8D-E6EfStSYonYSBZ8_4]]></FromUserName>
    <CreateTime>1610969440</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[subscribe_msg_popup_event]]></Event>
    <SubscribeMsgPopupEvent>
        <List>
            <TemplateId><![CDATA[VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc]]></TemplateId>
            <SubscribeStatusString><![CDATA[accept]]></SubscribeStatusString>
            <PopupScene>2</PopupScene>
        </List>
        <List>
            <TemplateId><![CDATA[9nLIlbOQZC5Y89AZteFEux3WCXRRRG5Wfzkpssu4bLI]]></TemplateId>
            <SubscribeStatusString><![CDATA[reject]]></SubscribeStatusString>
            <PopupScene>2</PopupScene>
        </List>
    </SubscribeMsgPopupEvent>
</xml>";
            var doc           = XDocument.Parse(xml);
            var requestEntity =
                RequestMessageFactory.GetRequestEntity(new MessageContexts.DefaultMpMessageContext(), doc) as
                RequestMessageEvent_Subscribe_Msg_Popup;


            Assert.IsNotNull(requestEntity);

            Assert.IsTrue(requestEntity.Event.ToString() == "subscribe_msg_popup_event");

            Assert.IsTrue(requestEntity.FromUserName == "otFpruAK8D-E6EfStSYonYSBZ8_4");
            Assert.IsTrue(requestEntity.SubscribeMsgPopupEvent.Count == 2);

            Assert.IsTrue(requestEntity.SubscribeMsgPopupEvent[1].TemplateId ==
                          "9nLIlbOQZC5Y89AZteFEux3WCXRRRG5Wfzkpssu4bLI");

            Assert.IsTrue(requestEntity.SubscribeMsgPopupEvent[1].SubscribeStatusString ==
                          "reject");

            Assert.IsTrue(requestEntity.SubscribeMsgPopupEvent[1].PopupScene == 2);
        }
Exemple #25
0
        public void ConvertEntityToXmlTest()
        {
            var doc           = XDocument.Parse(xml);
            var requestEntity = RequestMessageFactory.GetRequestEntity(doc);

            {
                //Text
                var responseText =
                    ResponseMessageBase.CreateFromRequestMessage(requestEntity, ResponseMsgType.Text) as
                    ResponseMessageText;
                Assert.IsNotNull(responseText);
                responseText.Content = "新内容";
                var responseDoc = EntityHelper.ConvertEntityToXml(responseText);

                Console.WriteLine(responseDoc.ToString());

                Assert.AreEqual("新内容", responseDoc.Root.Element("Content").Value);
            }

            {
                //News
                var responseNews =
                    ResponseMessageBase.CreateFromRequestMessage(requestEntity, ResponseMsgType.News) as
                    ResponseMessageNews;
                Assert.IsNotNull(responseNews);

                responseNews.Articles.Add(new Article()
                {
                    Description = "测试说明",
                    Title       = "测试标题",
                    Url         = "http://www.senparc.com",
                    PicUrl      = "http://img.senparc.com/images/v2/logo.jpg'"
                });
                Assert.AreEqual(1, responseNews.ArticleCount);
                var responseDoc = EntityHelper.ConvertEntityToXml(responseNews);
                Console.WriteLine(responseDoc.ToString());
            }
        }
Exemple #26
0
        public void ConvertEntityToXml_subscribe_msg_change_eventTest()
        {
            var xml = @"<xml>
    <ToUserName><![CDATA[gh_123456789abc]]></ToUserName>
    <FromUserName><![CDATA[otFpruAK8D-E6EfStSYonYSBZ8_4]]></FromUserName>
    <CreateTime>1610969440</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[subscribe_msg_change_event]]></Event>
    <SubscribeMsgChangeEvent>
        <List>
            <TemplateId><![CDATA[VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc]]></TemplateId>
            <SubscribeStatusString><![CDATA[reject]]></SubscribeStatusString>
        </List>
    </SubscribeMsgChangeEvent>
</xml>";

            var doc           = XDocument.Parse(xml);
            var requestEntity =
                RequestMessageFactory.GetRequestEntity(new MessageContexts.DefaultMpMessageContext(), doc) as
                RequestMessageEvent_Subscribe_Msg_Change;


            Assert.IsNotNull(requestEntity);


            Assert.IsTrue(requestEntity.Event.ToString() == "subscribe_msg_change_event");

            Assert.IsTrue(requestEntity.FromUserName == "otFpruAK8D-E6EfStSYonYSBZ8_4");
            Assert.IsTrue(requestEntity.SubscribeMsgChangeEvent.Count == 1);

            Assert.IsTrue(requestEntity.SubscribeMsgChangeEvent[0].TemplateId ==
                          "VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc");

            Assert.IsTrue(requestEntity.SubscribeMsgChangeEvent[0].SubscribeStatusString ==
                          "reject");
        }
        public void ConvertEntityToXml_ImageTest()
        {
            var imageXML      = @"<?xml version=""1.0"" encoding=""utf-8""?>
<xml>
  <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName>
  <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName>
  <CreateTime>1357996976</CreateTime>
  <MsgType><![CDATA[image]]></MsgType>
  <PicUrl><![CDATA[http://mmsns.qpic.cn/mmsns/ZxBXNzgHyUqazGkXUvujSOOHruk6XP5P9984HOCSATlW1orZDlpdCA/0]]></PicUrl>
  <MsgId>5832552599987382826</MsgId>
</xml>";
            var doc           = XDocument.Parse(imageXML);
            var requestEntity = RequestMessageFactory.GetRequestEntity(doc) as RequestMessageImage;

            Assert.IsNotNull(requestEntity);

            var responseNews =
                ResponseMessageBase.CreateFromRequestMessage(requestEntity, ResponseMsgType.News) as
                ResponseMessageNews;

            Assert.IsNotNull(responseNews);

            responseNews.Articles.Add(new Article()
            {
                Description = "测试说明",
                Title       = "测试标题",
                Url         = "http://www.senparc.com",
                PicUrl      = requestEntity.PicUrl
            });
            Assert.AreEqual(1, responseNews.ArticleCount);

            var responseDoc = EntityHelper.ConvertEntityToXml(responseNews);

            Console.WriteLine(responseDoc.ToString());
            Assert.AreEqual(requestEntity.PicUrl, responseDoc.Root.Element("Articles").Elements("item").First().Element("PicUrl").Value);
        }
Exemple #28
0
 private void Init(XDocument requestDocument)
 {
     this.RequestDocument = requestDocument;
     this.RequestMessage  = RequestMessageFactory.GetRequestEntity(this.RequestDocument);
 }
Exemple #29
0
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="postDataDocument"></param>
        /// <param name="postData"></param>
        /// <returns></returns>
        public override XDocument Init(XDocument postDataDocument, object postData = null)
        {
            //进行加密判断并处理
            _postModel = postData as PostModel;
            var postDataStr = postDataDocument.ToString();

            XDocument decryptDoc = postDataDocument;

            if (_postModel != null && postDataDocument.Root.Element("Encrypt") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("Encrypt").Value))
            {
                //使用了加密
                UsingEcryptMessage    = true;
                EcryptRequestDocument = postDataDocument;

                WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.AppId);
                string        msgXml   = null;
                var           result   = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml);

                //判断result类型
                if (result != 0)
                {
                    //验证没有通过,取消执行
                    CancelExcute = true;
                    return(null);
                }

                if (postDataDocument.Root.Element("FromUserName") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("FromUserName").Value))
                {
                    //TODO:使用了兼容模式,进行验证即可
                    UsingCompatibilityModelEcryptMessage = true;
                }

                decryptDoc = XDocument.Parse(msgXml);//完成解密
            }

            RequestMessage = RequestMessageFactory.GetRequestEntity(decryptDoc);
            if (UsingEcryptMessage)
            {
                RequestMessage.Encrypt = postDataDocument.Root.Element("Encrypt").Value;
            }


            //TODO:分布式系统中本地的上下文会有同步问题,需要同步使用远程的储存
            if (MessageContextGlobalConfig.UseMessageContext)
            {
                var omit = OmitRepeatedMessageFunc == null || OmitRepeatedMessageFunc(RequestMessage);

                lock (MessageContextGlobalConfig.OmitRepeatLock)//TODO:使用分布式锁
                {
                    #region 消息去重

                    if (omit &&
                        OmitRepeatedMessage &&
                        CurrentMessageContext.RequestMessages.Count > 0
                        //&& !(RequestMessage is RequestMessageEvent_Merchant_Order)批量订单的MsgId可能会相同
                        )
                    {
                        //lastMessage必定有值(除非极端小的过期时间条件下,几乎不可能发生)
                        var lastMessage = CurrentMessageContext.RequestMessages[CurrentMessageContext.RequestMessages.Count - 1];

                        if (
                            //使用MsgId去重
                            (lastMessage.MsgId != 0 && lastMessage.MsgId == RequestMessage.MsgId) ||
                            //使用CreateTime去重(OpenId对象已经是同一个)
                            (lastMessage.MsgId == RequestMessage.MsgId &&
                             lastMessage.CreateTime == RequestMessage.CreateTime &&
                             lastMessage.MsgType == RequestMessage.MsgType)
                            )
                        {
                            MarkRepeatedMessage();//标记为已重复
                        }

                        //判断特殊事件
                        if (!MessageIsRepeated &&
                            lastMessage is RequestMessageEventBase &&
                            RequestMessage is RequestMessageEventBase &&
                            (lastMessage as RequestMessageEventBase).Event == (RequestMessage as RequestMessageEventBase).Event
                            )
                        {
                            var lastEventMessage    = lastMessage as RequestMessageEventBase;
                            var currentEventMessage = RequestMessage as RequestMessageEventBase;
                            switch (lastEventMessage.Event)
                            {
                            case Event.user_get_card:    //领取事件推送
                                //文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025274
                                //问题反馈:https://github.com/JeffreySu/WeiXinMPSDK/issues/1106
                                var lastGetUserCardMessage    = lastMessage as RequestMessageEvent_User_Get_Card;
                                var currentGetUserCardMessage = RequestMessage as RequestMessageEvent_User_Get_Card;
                                if (lastGetUserCardMessage.UserCardCode == currentGetUserCardMessage.UserCardCode &&
                                    lastGetUserCardMessage.CardId == currentGetUserCardMessage.CardId)
                                {
                                    MarkRepeatedMessage();    //标记为已重复
                                }
                                break;

                            default:
                                break;
                            }
                        }
                    }

                    #endregion

                    //在消息没有被去重的情况下记录上下文
                    if (!MessageIsRepeated)
                    {
                        GlobalMessageContext.InsertMessage(RequestMessage);
                    }
                }
            }


            return(decryptDoc);
        }
        public ActionResult OldPost(string signature, string timestamp, string nonce, string echostr)
        {
            LocationService locationService = new LocationService();
            EventService    eventService    = new EventService();

            if (!CheckSignature.Check(signature, timestamp, nonce, Token))
            {
                return(Content("参数错误!"));
            }
            XDocument requestDoc = null;

            try
            {
                requestDoc = XDocument.Load(Request.InputStream);

                var requestMessage = RequestMessageFactory.GetRequestEntity(requestDoc);
                //如果不需要记录requestDoc,只需要:
                //var requestMessage = RequestMessageFactory.GetRequestEntity(Request.InputStream);

                requestDoc.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_" + requestMessage.FromUserName + ".txt"));//测试时可开启,帮助跟踪数据
                ResponseMessageBase responseMessage = null;
                switch (requestMessage.MsgType)
                {
                case RequestMsgType.Text:    //文字
                {
                    //TODO:交给Service处理具体信息,参考/Service/EventSercice.cs 及 /Service/LocationSercice.cs
                    var strongRequestMessage  = requestMessage as RequestMessageText;
                    var strongresponseMessage =
                        ResponseMessageBase.CreateFromRequestMessage(requestMessage, ResponseMsgType.Text) as
                        ResponseMessageText;
                    strongresponseMessage.Content =
                        string.Format(
                            "您刚才发送了文字信息:{0}\r\n您还可以发送【位置】【图片】【语音】等类型的信息,查看不同格式的回复。\r\nSDK官方地址:http://weixin.senparc.com",
                            strongRequestMessage.Content);
                    responseMessage = strongresponseMessage;
                    break;
                }

                case RequestMsgType.Location:    //位置
                {
                    responseMessage = locationService.GetResponseMessage(requestMessage as RequestMessageLocation);
                    break;
                }

                case RequestMsgType.Image:    //图片
                {
                    //TODO:交给Service处理具体信息
                    var strongRequestMessage  = requestMessage as RequestMessageImage;
                    var strongresponseMessage =
                        ResponseMessageBase.CreateFromRequestMessage(requestMessage, ResponseMsgType.News) as
                        ResponseMessageNews;
                    strongresponseMessage.Articles.Add(new Article()
                        {
                            Title       = "您刚才发送了图片信息",
                            Description = "您发送的图片将会显示在边上",
                            PicUrl      = strongRequestMessage.PicUrl,
                            Url         = "http://weixin.senparc.com"
                        });
                    strongresponseMessage.Articles.Add(new Article()
                        {
                            Title       = "第二条",
                            Description = "第二条带连接的内容",
                            PicUrl      = strongRequestMessage.PicUrl,
                            Url         = "http://weixin.senparc.com"
                        });
                    responseMessage = strongresponseMessage;
                    break;
                }

                case RequestMsgType.Voice:    //语音
                {
                    //TODO:交给Service处理具体信息
                    var strongRequestMessage  = requestMessage as RequestMessageVoice;
                    var strongresponseMessage =
                        ResponseMessageBase.CreateFromRequestMessage(requestMessage, ResponseMsgType.Music) as
                        ResponseMessageMusic;
                    strongresponseMessage.Music.MusicUrl = "http://weixin.senparc.com/Content/music1.mp3";
                    responseMessage = strongresponseMessage;
                    break;
                }

                case RequestMsgType.Event:    //事件
                {
                    responseMessage = eventService.GetResponseMessage(requestMessage as RequestMessageEventBase);
                    break;
                }

                default:
                    throw new ArgumentOutOfRangeException();
                }
                var responseDoc = MP.Helpers.EntityHelper.ConvertEntityToXml(responseMessage);
                responseDoc.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Response_" + responseMessage.ToUserName + ".txt"));//测试时可开启,帮助跟踪数据

                return(Content(responseDoc.ToString()));
                //如果不需要记录responseDoc,只需要:
                //return Content(responseMessage.ConvertEntityToXmlString());
            }
            catch (Exception ex)
            {
                using (
                    TextWriter tw = new StreamWriter(Server.MapPath("~/App_Data/Error_" + DateTime.Now.Ticks + ".txt")))
                {
                    tw.WriteLine(ex.Message);
                    tw.WriteLine(ex.InnerException.Message);
                    if (requestDoc != null)
                    {
                        tw.WriteLine(requestDoc.ToString());
                    }
                    tw.Flush();
                    tw.Close();
                }
                return(Content(""));
            }
        }