public static string CreateConnection(QSettingModel setting, bool isTransmitter)
        {
            var res = $"host={setting.ServerAddress}";

            if (isTransmitter)
            {
                res += ";publisherConfirms=true";
            }


            if (setting.Timeout != null)
            {
                res += $";timeout={setting.Timeout.Value}";
            }

            if (!string.IsNullOrWhiteSpace(setting.UserName))
            {
                res += $";username={setting.UserName};password={setting.Password}";
            }

            if (!string.IsNullOrWhiteSpace(setting.VirtualHost))
            {
                res += $";virtualHost={setting.VirtualHost}";
            }

            return(res);
        }
示例#2
0
        public static T Register(QSettingModel setting)
        {
            var res = CreateProxy(null);

            (res as RPCTransmitter <T>)?.SetQueueName(setting);

            return(res);
        }
示例#3
0
        protected Receiver(QSettingModel qSetting)
        {
            SettingModel = qSetting;

            var connectionString = QCreateConnectionString.CreateConnection(qSetting, false);

            _bus = RabbitHutch.CreateBus(connectionString);

            if (HaveRequestMessage)
            {
                _bus.RespondAsync <TRequest, TResponse>(HandleRequestMessage,
                                                        c => c.WithQueueName(qSetting.QueueName));
            }

            if (HaveSendMessage)
            {
                _bus.SubscribeAsync <TMessage>(
                    $"{qSetting.QueueName}_R",
                    HandleSendMessage,
                    c => c.WithQueueName($"{qSetting.QueueName}_R"));
            }
        }
示例#4
0
 public async Task Send(QSettingModel setting, QBaseMessage request)
 {
     CreateBus(setting);
     await _bus.SendAsync(setting.QueueName + "_R", request);
 }
示例#5
0
 public async Task <QBaseResponse> Request(QSettingModel setting, QBaseRequest request)
 {
     CreateBus(setting);
     return(await _bus.RequestAsync <QBaseRequest, QBaseResponse>(request,
                                                                  c => c.WithQueueName(setting.QueueName)));
 }
示例#6
0
        private void CreateBus(QSettingModel setting)
        {
            var connectionString = QCreateConnectionString.CreateConnection(setting, true);

            _bus = RabbitHutch.CreateBus(connectionString);
        }
示例#7
0
        public static void AddWebReceiverService <THostedService>(this WindsorContainer container, QSettingModel qSetting)
            where THostedService : WebServiceReceiver
        {
            var wr = new BaseWebServiceReceiver <THostedService>(qSetting);

            wr.Start();

            container.Register(Component.For <THostedService>());
        }
示例#8
0
        public static void AddWebReceiverService(this IWindsorContainer container, QSettingModel qSetting)
        {
            var wr = new BaseWebReceiver(qSetting);

            wr.Start();
        }
示例#9
0
        //protected int? ReturnStatus = null;
        //protected Dictionary<string, string> ReturnHeader = null;

        public BaseWebServiceReceiver(QSettingModel qSetting) : base(qSetting)
        {
        }
示例#10
0
        private async Task <QWebResponse> SendRequest(QWebRequestMessage request, QSettingModel settingModel)
        {
            var res = new QWebResponse()
            {
                TraceId = request.TraceId
            };

            try
            {
                HttpMethod httpMethod;
                switch (request.HttpMethod.ToUpper())
                {
                case "POST":
                    httpMethod = HttpMethod.Post;
                    break;

                case "GET":
                    httpMethod = HttpMethod.Get;
                    break;

                case "PUT":
                    httpMethod = HttpMethod.Put;
                    break;

                case "DELETE":
                    httpMethod = HttpMethod.Delete;
                    break;

                case "OPTIONS":
                    httpMethod = HttpMethod.Options;
                    break;

                case "HEAD":
                    httpMethod = HttpMethod.Head;
                    break;

                default:
                    httpMethod = HttpMethod.Get;
                    break;
                }

                var appSetting = IoC.Resolve <IAppSetting>();

                var url = new Uri(appSetting.Get("EngineUrl"));
                request.Domain = url.Authority;
                request.Scheme = url.Scheme;

                var message = new HttpRequestMessage(httpMethod,
                                                     new Uri(new Uri(request.BaseUrl),
                                                             $"{request.Arguments}{request.QueryStrings}"));

                //Debugger.Break();
                if (request.Headers?.Any() ?? false)
                {
                    if (request.Headers.Any(k => k.Key == "Host"))
                    {
                        request.Headers.Remove("Host");
                        request.Headers.Add("Host", new[] { request.Domain });
                    }

                    if (request.Headers.ContainsKey("Content-Type") &&
                        request.Headers["Content-Type"][0].StartsWith("application/x-www-form-urlencoded"))
                    {
                        //message.Content = new StringContent(request.Body);
                        var items = HttpUtility.ParseQueryString(request.Body.FromBytes());
                        message.Content = new FormUrlEncodedContent(items.ToNameValueCollection <string, string>());
                    }

                    if (request.Headers.ContainsKey("Content-Type") &&
                        request.Headers["Content-Type"][0].StartsWith("multipart/form-data; boundary"))
                    {
                        var parser = MultipartFormDataParser.Parse(new MemoryStream(request.Body), Encoding.UTF8);

                        var cont = new MultipartFormDataContent();
                        foreach (var file in parser.Files ?? new List <FilePart>())
                        {
                            var f = new StreamContent(file.Data);

                            f.Headers.Add("Content-Disposition",
                                          new string(Encoding.UTF8
                                                     .GetBytes($"form-data; name=\"{file.Name}\"; filename=\"{file.FileName}\"")
                                                     .Select(b => (char)b).ToArray()));
                            f.Headers.Add("Content-Type", file.ContentType);

                            if (!string.IsNullOrWhiteSpace(file.Name) && !string.IsNullOrWhiteSpace(file.FileName))
                            {
                                cont.Add(f, file.Name, file.FileName);
                            }
                            else if (!string.IsNullOrWhiteSpace(file.Name))
                            {
                                cont.Add(f, file.Name);
                            }
                            else
                            {
                                cont.Add(f);
                            }
                        }

                        foreach (var item in parser.Parameters ?? new List <ParameterPart>())
                        {
                            cont.Add(new StringContent(item.Data), item.Name);
                        }

                        message.Content = cont;
                    }

                    if (request.Headers.ContainsKey("Content-Type") &&
                        request.Headers["Content-Type"][0].StartsWith("application/json"))
                    {
                        message.Content = new StringContent(request.Body.FromBytes(), Encoding.UTF8,
                                                            request.Headers["Content-Type"][0]);
                    }

                    foreach (var header in request.Headers)
                    {
                        if (_blockedHeader.Contains(header.Key.ToLower()))
                        {
                            continue;
                        }

                        if (header.Key == "Content-Type" &&
                            header.Value[0].StartsWith("application/x-www-form-urlencoded"))
                        {
                            continue;
                        }

                        if (!string.IsNullOrWhiteSpace(
                                message
                                .Headers
                                .FirstOrDefault(d =>
                                                string.Equals(d.Key, header.Key, StringComparison.CurrentCultureIgnoreCase)).Key))
                        {
                            message.Headers.Remove(header.Key);
                            message.Headers.Remove(header.Key.ToLower());
                        }

                        message.Headers.Add(header.Key, header.Value);
                    }
                }

                message.Headers.Add("MIP", request.IP);

                var imp = Globals.GetImplementedInterfaceOf <IWebReceiverExt>();
                if (imp?.Any() ?? false)
                {
                    foreach (var item in imp)
                    {
                        item.BeforeSend(message, request);
                    }
                }

                var cancellationToken = new CancellationTokenSource();
                cancellationToken.CancelAfter((settingModel.Timeout ?? 15 / 1000) * 1000);

                var wRes = await RequestClient.SendAsync(message, cancellationToken.Token);

                if (wRes == null)
                {
                    return(res);
                }

                res.Status = (int)wRes.StatusCode;

                res.Headers = new Dictionary <string, string[]>();

                var headers =
                    wRes.Content.Headers.Select(k => new KeyValuePair <string, IEnumerable <string> >(k.Key, k.Value))
                    .ToList();
                if (wRes.Headers != null)
                {
                    var keys  = headers.Select(c => c.Key);
                    var items = wRes.Headers.Where(c => !keys.Contains(c.Key));

                    headers.AddRange(items);
                }

                foreach (var item in headers)
                {
                    if (item.Key == "Transfer-Encoding")
                    {
                        continue;
                    }

                    res.Headers.Add(item.Key, item.Value.ToArray());
                }

                //var content = await wRes.Content.ReadAsStringAsync();
                var contB = await wRes.Content.ReadAsByteArrayAsync();

                var content = Convert.ToBase64String(contB);
                res.Response = content;
            }
            catch (Exception e)
            {
                var obj = new
                {
                    request,
                    settingModel,
                    e
                };
                res.Status = (int)HttpStatusCode.InternalServerError;

                if (Debugger.IsAttached)
                {
                    res.Response = JsonConvert.SerializeObject(obj).Base64Encode();
                }
            }

            return(res);
        }
示例#11
0
 private void SetQueueName(QSettingModel setting)
 {
     qSetting = setting;
 }
示例#12
0
 public BaseRPCReceiver(QSettingModel qSetting) : base(qSetting)
 {
 }