/// <summary>
        /// 调用。
        /// </summary>
        /// <param name="context">处理上下文。</param>
        /// <returns>任务。</returns>
        public override Task Invoke(IHandlerContext context)
        {
            var dependencyResolver    = context.GetDependencyResolver();
            var requestMessageFactory = dependencyResolver.GetService <IRequestMessageFactory>();

            var content    = context.Content;
            var parameters = context.GetRequestParameters();


            if (parameters.ContainsKey("encrypt_type"))
            {
                var nonce     = parameters["nonce"];
                var signature = parameters["msg_signature"];
                var timestamp = parameters["timestamp"];

                var baseInfo       = context.GetMessageHandlerBaseInfo();
                var appId          = baseInfo.AppId;
                var encodingAesKey = baseInfo.EncodingAesKey;
                var token          = baseInfo.Token;

                var wxBizMsgCrypt = new WXBizMsgCrypt(token, encodingAesKey, appId);
                wxBizMsgCrypt.DecryptMsg(signature, timestamp, nonce, content, ref content);
            }


            context.SetRequestMessage(requestMessageFactory.CreateRequestMessage(content));

            return(Next.Invoke(context));
        }
        /// <summary>
        /// 调用。
        /// </summary>
        /// <param name="context">处理上下文。</param>
        /// <returns>任务。</returns>
        public override Task Invoke(IHandlerContext context)
        {
            var responseMessage = context.GetResponseMessage();

            if (responseMessage == null)
            {
                context.ResponseXml = string.Empty;
            }
            else
            {
                var requestMessage = context.GetRequestMessage();

                //基本信息初始化。
                responseMessage.CreateTime   = DateTime.Now;
                responseMessage.FromUserName = requestMessage.ToUserName;
                responseMessage.ToUserName   = requestMessage.FromUserName;

                var dependencyResolver     = context.GetDependencyResolver();
                var responseMessageFactory = dependencyResolver.GetService <IResponseMessageFactory>();
                var content = responseMessageFactory.GetXmlByReponseMessage(responseMessage);

                #region Encrypt

                if (!string.IsNullOrWhiteSpace(content))
                {
                    var parameters  = context.GetRequestParameters();
                    var encryptType = parameters["encrypt_type"];

                    if (encryptType != null)
                    {
                        var nonce     = parameters["nonce"];
                        var timestamp = parameters["timestamp"];

                        var baseInfo       = context.GetMessageHandlerBaseInfo();
                        var appId          = baseInfo.AppId;
                        var encodingAesKey = baseInfo.EncodingAesKey;
                        var token          = baseInfo.Token;

                        var wxBizMsgCrypt = new WXBizMsgCrypt(token, encodingAesKey, appId);
                        wxBizMsgCrypt.EncryptMsg(content, timestamp, nonce, ref content);
                    }
                }

                #endregion Encrypt

                context.ResponseXml = content;
            }

            return(Next.Invoke(context));
        }
Example #3
0
        /// <summary>
        /// 调用。
        /// </summary>
        /// <param name="context">处理上下文。</param>
        /// <returns>任务。</returns>
        public override Task Invoke(IHandlerContext context)
        {
            //HTTP正文。
            var bytes = Encoding.UTF8.GetBytes(context.Content);

            //根据查询字符串变量集合得到一个参数字典表。
            var parameters = context.GetRequestParameters();
            //得到最终的请求Url。
            var postUrl = AppendParameter(_agentRequestModel.Uri.ToString(), parameters);

            Func <Task <string> > getPostTask =
                () =>
            {
                var task = Task.Factory.StartNew(() => Encoding.UTF8.GetString(HttpHelper.Post(postUrl, bytes)));
                //防止出错时程序崩溃。
                task.ContinueWith(t => { }, TaskContinuationOptions.OnlyOnFaulted);
                return(task);
            };

            string    content   = null;
            Exception exception = null;

            //开始请求。
            for (var i = 0; i < _agentRequestModel.RetryCount + 1 /*重试次数加上一次必需请求的次数*/; i++)
            {
                var task      = getPostTask();
                var isTimeout = !task.Wait(_agentRequestModel.Timeout);

                exception = task.Exception;
                //超时或者失败则进行尝试。
                if (isTimeout || task.IsFaulted)
                {
                    continue;
                }

                content = task.Result;
                //结束请求。
                break;
            }

            if (content == null)
            {
                throw new Exception("代理请求次数超过了重试次数并且目标方还是没有正确响应" + (exception == null ? "。" : "错误消息:" + exception.Message));
            }

            context.ResponseXml = content;

            return(Next.Invoke(context));
        }
        /// <summary>
        /// 调用。
        /// </summary>
        /// <param name="context">处理上下文。</param>
        /// <returns>任务。</returns>
        public override Task Invoke(IHandlerContext context)
        {
            var parameters = context.GetRequestParameters();
            var signature  = parameters["signature"];
            var timestamp  = parameters["timestamp"];
            var nonce      = parameters["nonce"];
            var token      = context.GetMessageHandlerBaseInfo().Token;

            var dependencyResolver = context.GetDependencyResolver();
            var signatureService   = dependencyResolver.GetService <ISignatureService>();

            if (!signatureService.Check(signature, timestamp, nonce, token))
            {
                throw new Exception("非法请求。");
            }

            return(Next.Invoke(context));
        }