Пример #1
0
        public ActionResult DownloadQueueWithMediaId()
        {
            FileDownloadQueueWithMediaIdArgs args = RequestArgs <FileDownloadQueueWithMediaIdArgs>();

            if (args == null)
            {
                return(RespondResult(false, "参数无效。"));
            }

            //_fileDownloadQueue.ServerRootDir = Server.MapPath("/");

            //DomainContext domainContext = _fileDomainPool.GetDomainContext(args.Domain);

            FileDownloadQueueEntity item = new FileDownloadQueueEntity();

            item.Domain      = args.Domain;
            item.AppId       = args.AppId;
            item.CreateTime  = DateTime.Now;
            item.MediaId     = args.MediaId;
            item.CallbackUrl = args.CallbackUrl;
            item.Tag         = args.Tag;

            _fileDownloadQueue.Enqueue(item);

            return(RespondResult());
        }
        public void Enqueue(FileDownloadQueueEntity item)
        {
            if (item == null)
            {
                _log.Write("FileDownloadQueueEntity == null", String.Empty, TraceEventType.Warning);
                return;
            }

            _dataBase.Insert(item);
        }
        private void Download(FileDownloadQueueEntity item)
        {
            _log.Write("下载队列中的文件", JsonConvert.SerializeObject(item), TraceEventType.Verbose);

            DomainContext domainContext = _fileDomainPool.GetDomainContext(item.Domain);

            if (domainContext == null)
            {
                item.Status     = FileDownloadQueueItemStatus.Done;
                item.Success    = false;
                item.Message    = "无效域";
                item.FinishTime = DateTime.Now;
                _dataBase.Update(item);
                return;
            }

            string targetDir = Path.Combine(_serverRootDir, "FileStore", item.Domain.ToString());

            if (Directory.Exists(targetDir) == false)
            {
                Directory.CreateDirectory(targetDir);
            }

            string accessToken = domainContext.AccessToken;

            HttpDownloadArgs downloadArgs = new HttpDownloadArgs();

            downloadArgs.Url = String.Format(
                "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}",
                accessToken, item.MediaId);
            downloadArgs.TargetDir = targetDir;

            HttpDownloadResult downloadResult = _httpService.Download(downloadArgs);

            if (downloadResult.Success == false)
            {
                item.Status     = FileDownloadQueueItemStatus.Done;
                item.Success    = false;
                item.Message    = "下载失败:" + downloadResult.Message;
                item.FinishTime = DateTime.Now;
                _dataBase.Update(item);
                return;
            }

            item.Status      = FileDownloadQueueItemStatus.Done;
            item.Success     = downloadResult.Success;
            item.Message     = downloadResult.Message;
            item.OutputFile  = String.Format("FileStore/{0}/{1}", item.Domain, downloadResult.StoreFileName);
            item.ContentType = downloadResult.ContentType;
            item.FileLength  = (int)(downloadResult.FileLength / 1024);

            FileDownloadQueueWithMediaIdResult result = new FileDownloadQueueWithMediaIdResult();

            result.Success     = item.Success;
            result.Message     = item.Message;
            result.OutputFile  = item.OutputFile;
            result.ContentType = item.ContentType;
            result.Tag         = item.Tag;
            result.MediaId     = item.MediaId;
            result.FileLength  = item.FileLength;

            _log.Write("下载队列中的文件返回(WithMediaId)", JsonConvert.SerializeObject(result), TraceEventType.Verbose);

            //把下载结果POST到回调地址上
            HttpRequestArgs requestArgs = new HttpRequestArgs();

            requestArgs.Method  = "POST";
            requestArgs.Url     = item.CallbackUrl;
            requestArgs.Content = JsonConvert.SerializeObject(result);

            HttpRequestResult requestResult = _httpService.Request(requestArgs);

            if (requestResult.Success)
            {
                ApiResult callbackApiResult = JsonConvert.DeserializeObject <ApiResult>(requestResult.Content);
                if (callbackApiResult.Success == false)
                {
                    item.Status     = FileDownloadQueueItemStatus.Done;
                    item.Success    = false;
                    item.Message    = "回调失败:" + callbackApiResult.Message;
                    item.FinishTime = DateTime.Now;
                }
            }
            else
            {
                item.Status     = FileDownloadQueueItemStatus.Done;
                item.Success    = false;
                item.Message    = "回调失败:" + requestResult.Exception.Message;
                item.FinishTime = DateTime.Now;
            }

            _dataBase.Update(item);
        }