/// <summary> /// 请求目标服务器,获取响应结果 /// </summary> /// <param name="request"></param> /// <param name="url"></param> /// <param name="baseAddress"></param> /// <param name="sessionRequired">是否需要会话支持</param> /// <param name="isAuthenticated">当前请求必须是登录验证过的,默认不要求</param> /// <returns></returns> private async Task <HttpResponseMessage> GetNewResponseMessage(HttpRequestMessage request, string url, Uri baseAddress, bool sessionRequired, bool isAuthenticated = false) { string userHostAddress = HttpContext.Current.Request.UserHostAddress; HttpClient client = GetHttpClient(baseAddress, request, sessionRequired); var identity = HttpContext.Current.User.Identity; if (identity == null || identity.IsAuthenticated == false) { if (isAuthenticated) { if (this.Config.EnableRequestLog) { string logTxt = string.Format("Begin Time:{0} ,\r\n {1} Request-Url:{2} {3} ,\r\n Map-Url:{4} {5} ,\r\n []:{6} Statue:{7} \r\n ExctionMessage:{8}", DateTime.Now.ToLongTimeString(), userHostAddress, request.Method.ToString(), request.RequestUri.ToString(), client.BaseAddress.ToString(), url, "[N/A]", "Unauthorized", "this url request need is authenticated." ); WriteLogFile(logTxt); } HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.Unauthorized); response.Headers.Add("Proxy-Server", this.Config.ServerName); return(response); } else { return(await ProxyReuqest(request, url, client, "[NULL]")); } } //处理代理的服务器变量: //url = url.Replace("[UserName]", identity.Name); //请求结果无权限,重新获取令牌,尝试3次 int unauthorizedCount = 0; string errorMessage = ""; for (int i = 0; i < 3; i++) { using (TokenManager tm = new TokenManager(identity.Name, null)) { //重试的时候,强制刷新令牌 if (i > 0) { tm.NeedRefresh = true; } TokenResponse token = tm.TakeToken(); //存在客户端登录,但是服务器重启会话丢失的情况,这时候将无法取到令牌, //这种情况下视为客户未登录,由资源服务器来决定该访问是否需要验证授权 //所以代理服务不直接抛出错误请求。 if (token == null) { if (this.Config.EnableRequestLog) { string logTxt = string.Format("Begin Time:{0} ,\r\n {1} Request-Url:{2} {3} ,\r\n Map-Url:{4} {5} ,\r\n Old-Token:{6}\r\n Statue:{7} \r\n ExctionMessage:{8}", DateTime.Now.ToLongTimeString(), userHostAddress, request.Method.ToString(), request.RequestUri.ToString(), client.BaseAddress.ToString(), url, tm.OldToken == null ? "[OldToken=null]" : tm.OldToken.AccessToken, "TokenGainFailure", tm.TokenExctionMessage ); WriteLogFile(logTxt); } if (tm.TokenExctionMessage == "UserNoToken") { return(await ProxyReuqest(request, url, client, tm.UserName)); } else { return(SendError("代理请求刷新令牌失败:" + tm.TokenExctionMessage, HttpStatusCode.Unauthorized)); } } else { try { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.AccessToken); var result = await ProxyReuqest(request, url, client, tm.UserName); if (result.StatusCode == HttpStatusCode.Unauthorized) { WriteLogFile(string.Format("----未授权,尝试第{0}次访问----", i + 1)); unauthorizedCount++; client = GetHttpClient(baseAddress, request, true); } else { return(result); } } catch (Exception ex) { errorMessage = string.Format("----{0} Proxy Request Error:{1},Request Url:{2} ----", DateTime.Now.ToString("HH:mm:ss.fff"), ex.Message, url); if (ex.InnerException != null) { errorMessage += ex.InnerException.Message; } WriteLogFile(errorMessage); WriteLogFile(ex.StackTrace); break; } } } }//end for if (unauthorizedCount >= 3) { return(SendError("已经3次尝试使用令牌访问资源服务器,仍然被拒绝授权访问。", HttpStatusCode.Unauthorized)); } else { return(SendError("访问资源服务器发生错误:" + errorMessage, HttpStatusCode.InternalServerError)); } }