コード例 #1
0
        protected override object OnExecute(CommandContext context)
        {
            if (context.Parameter == null && context.Expression.Arguments.Length == 0)
            {
                throw new CommandException(ResourceUtility.GetString("Text.MissingCommandArguments"));
            }

            var destination = context.Expression.Options.GetValue <string>("target");

            if (string.IsNullOrWhiteSpace(destination))
            {
                throw new CommandOptionMissingException("target");
            }

            var settings = new PushingSenderSettings(context.Expression.Options.GetValue <PushingType>("type"),
                                                     context.Expression.Options.GetValue <PushingDeviceType>("deviceType"),
                                                     context.Expression.Options.GetValue <PushingTargetType>("targetType"),
                                                     context.Expression.Options.GetValue <int>("expiry"));

            var results = new List <ICommandResult>();

            if (context.Parameter != null)
            {
                var content = this.GetContent(context.Parameter);

                var result = this.Send(
                    context.Expression.Options.GetValue <string>("name"),
                    context.Expression.Options.GetValue <string>("title"),
                    content, destination, settings, _ => context.Error.WriteLine(ResourceUtility.GetString("Text.NotificationSendCommand.Faild")));

                if (result != null)
                {
                    results.Add(result.ToCommandResult());
                }
            }

            foreach (var argument in context.Expression.Arguments)
            {
                var result = this.Send(
                    context.Expression.Options.GetValue <string>("name"),
                    context.Expression.Options.GetValue <string>("title"),
                    argument, destination, settings, _ => context.Error.WriteLine(ResourceUtility.GetString("Text.NotificationSendCommand.Faild")));

                if (result != null)
                {
                    results.Add(result.ToCommandResult());
                }
            }

            if (results.Count == 0)
            {
                return(null);
            }
            else if (results.Count == 1)
            {
                return(results[0]);
            }

            return(results);
        }
コード例 #2
0
        /// <summary>
        /// 发送消息或通知到移动设备。
        /// </summary>
        /// <param name="name">指定的消息推送应用的名字。</param>
        /// <param name="title">指定的消息或通知的标题。</param>
        /// <param name="content">指定的消息或通知的内容。</param>
        /// <param name="destination">指定的推送目标。</param>
        /// <param name="settings">指定的推送设置参数。</param>
        /// <returns>返回推送的结果。</returns>
        public async Task <PushingResult> SendAsync(string name, string title, string content, string destination, PushingSenderSettings settings)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException(nameof(name));
            }

            if (string.IsNullOrWhiteSpace(destination))
            {
                throw new ArgumentNullException(nameof(destination));
            }

            if (string.IsNullOrWhiteSpace(content))
            {
                return(null);
            }

            //确认移动推送的配置
            var configuration = this.EnsureConfiguration();

            //获取指定名称的短信模板配置,如果获取失败则抛出异常
            if (!configuration.Apps.TryGet(name, out var app))
            {
                throw new InvalidOperationException($"The specified '{name}' app is not existed.");
            }

            //获取当前短信模板关联的凭证
            var certificate = this.GetCertificate(app);

            //生成请求的查询参数集
            var parameters = this.GenerateParameters(app, settings);

            parameters["TargetValue"] = destination;
            parameters["Title"]       = string.IsNullOrWhiteSpace(title) ? "New " + settings.Type.ToString() : title;
            parameters["Body"]        = content;

            //获取当前应用所在的服务区域
            var center = PushingServiceCenter.GetInstance(this.GetRegion(app));

            //构建移动推送的HTTP请求消息包
            var request = new HttpRequestMessage(HttpMethod.Get, "http://" + center.Path + "?" + Utility.GetQueryString(parameters));

            request.Headers.Accept.TryParseAdd("application/json");

            //获取当前实例关联的HTTP客户端程序
            var http = this.GetHttpClient(certificate);

            //提交移动推送请求
            var response = await http.SendAsync(request);

            return(await this.GetResultAsync(response.Content));
        }
コード例 #3
0
        protected virtual IDictionary <string, string> GenerateParameters(Options.IAppOption app, PushingSenderSettings settings)
        {
            var center = PushingServiceCenter.GetInstance(this.GetRegion(app));

            var dictionary = new Dictionary <string, string>()
            {
                //推送方式(高级推送)
                { "Action", "Push" },

                //以下是公共参数部分
                { "Format", "JSON" },
                { "RegionId", center.Alias },
                { "Version", "2016-08-01" },
                { "AccessKeyId", this.GetCertificate(app).Name },
                { "SignatureMethod", "HMAC-SHA1" },
                { "SignatureVersion", "1.0" },
                { "SignatureNonce", ((ulong)Zongsoft.Common.Randomizer.GenerateInt64()).ToString() },
                { "Timestamp", Utility.GetTimestamp() },

                //以下是推送接口特定参数
                { "AppKey", app.Code },
                { "PushType", settings.Type.ToString().ToUpperInvariant() },
                { "DeviceType", settings.DeviceType.ToString().ToUpperInvariant() },
                { "Target", settings.TargetType.ToString().ToUpperInvariant() },
            };

            if (settings.Expiry > 0)
            {
                dictionary["StoreOffline"] = "true";
                dictionary["ExpireTime"]   = DateTime.UtcNow.AddMinutes(settings.Expiry).ToString("s") + "Z";
            }

            return(dictionary);
        }
コード例 #4
0
        private PushingResult Send(string name, string title, string content, string destination, PushingSenderSettings settings, Action <PushingResult> onFaild)
        {
            var result = Utility.ExecuteTask(() => _sender.SendAsync(name, title, content, destination, settings));

            if (result != null)
            {
                if (!result.IsSucceed && onFaild != null)
                {
                    onFaild(result);
                }
            }

            return(result);
        }