public void Intercept(IInvocation invocation) { var client = new RestClient(_baseUrl); client.Timeout = int.Parse(ConfigurationManager.AppSettings[CLINET_REST_TIMEOUT]); var methodInfo = invocation.Method; var route = methodInfo.GetCustomAttributes <RouteAttribute>().First().Template; var method = GetHttpMethod(methodInfo); var restRequest = new RestRequest(route, method); // adds "Token" to header var url = _baseUrl + route; if (!IsLogin(url) && !IsExchangeRates(url) && !IsRegister(url) && !IsRegisterPending(url) && !IsAnonymous(url)) { restRequest.AddHeader(TOKEN_HEADER, _token.GetToken()); } // adds "Accept-Language" to header string uiLanguage = Thread.CurrentThread.CurrentUICulture.Name; if (uiLanguage.Equals(SPANISH_LANGUAGE)) { restRequest.AddHeader(ACCEPT_LANGUAGE_HEADER, uiLanguage); } else { restRequest.AddHeader(ACCEPT_LANGUAGE_HEADER, ENGLISH_LANGUAGE); } // adds client ip address to header. restRequest.AddHeader(CLIENT_IP_ADDRESS, HttpContext.Current.Request.UserHostAddress); // adds validation code to heander. SetValidationCode(restRequest); // adds j1kpme4dvag1dt0tmjbx0oeh to ASP.NET_SessionId cookie. POS backend's session id will be hardcoded. restRequest.AddCookie(ASP_NET_SESSION_ID, HttpContext.Current.Session.SessionID); var parameters = methodInfo.GetParameters(); // handles the segment parameters in url, i.e. {controller}/{id}, the id is a segment parameter var segmentCount = route.Count(c => c == '{'); for (var i = 0; i < segmentCount; i++) { restRequest.AddUrlSegment(parameters[i].Name, invocation.Arguments[i].ToString()); } // handles the parameters except segment parameters for (var i = segmentCount; i < parameters.Count(); i++) { var parameter = parameters[i]; var argument = invocation.Arguments[i]; var argumentType = argument.GetType(); if ((argumentType.IsPrimitive || argumentType.IsValueType || argumentType == typeof(string))) { AddSimpleParameter(restRequest, parameter, argument, argumentType); } else if (argumentType.IsArray) { AddArrayParameter(restRequest, parameter, argument, argumentType); } else { AddObjectParameter(restRequest, parameter, argument, argumentType); } } var methodName = methodInfo.ReflectedType.FullName + "." + methodInfo.Name; _loggerHelper.LogWebRequest(methodName, LogWebRequestState.Request, LogWebRequestType.Exec); // handles the response var response = client.Execute(restRequest); _loggerHelper.LogWebRequest(methodName, LogWebRequestState.Completed, LogWebRequestType.Exec); int responseCode = (int)response.StatusCode; if (responseCode == 200) { var returnValue = JsonConvert.DeserializeObject(response.Content, methodInfo.ReturnType, _jsonSerializerSettings); invocation.ReturnValue = returnValue; } else if (responseCode != 204) { if (string.IsNullOrEmpty(response.Content)) { _loggerHelper.LogWebRequest(methodName, LogWebRequestState.Error, LogWebRequestType.Exec, response.ErrorMessage); throw new Exception(response.ErrorMessage); } else { _loggerHelper.LogWebRequest(methodName, LogWebRequestState.Error, LogWebRequestType.Exec, response.Content); throw new WebException(response.Content); } } else { if (string.IsNullOrEmpty(response.Content)) { _loggerHelper.LogWebRequest(methodName, LogWebRequestState.Error, LogWebRequestType.Exec, response.ErrorMessage); } else { _loggerHelper.LogWebRequest(methodName, LogWebRequestState.Error, LogWebRequestType.Exec, response.Content); } } }