ReCaptcha v3本地运行正常 远程服务器返回500内部错误如何解决
ReCaptcha v3 部署后返回500错误解决方案
核心问题定位
该问题属于本地与IIS服务器运行环境差异、代码不规范共同导致的异常,核心原因包括异步方法同步调用引发IIS死锁、前后端参数传递缺失、静态变量线程安全隐患、配置不匹配四类。
修复方案
1. 前端代码修正
原有代码未获取reCaptcha生成的校验令牌也未传递给后端,同时jQuery异步错误回调配置错误,修正后代码如下:
(function () { $('#btnLogin').click(function () { grecaptcha.ready(function() { // 替换为你申请的reCaptcha v3站点密钥 grecaptcha.execute('YOUR_RECAPTCHA_SITE_KEY', {action: 'login'}).then(function(token) { $.ajax({ type: "POST", url: "/captcha/lasttry.aspx/CaptchaVerify", data: JSON.stringify({token: token}), contentType: "application/json; charset=utf-8", dataType: "json", success: function (response) { var _response = JSON.parse(response.d); if (_response.score < 0.5) { $('#status').text("User is not human being! Score = " + _response.score); $('#status').removeClass('text-info').addClass('text-danger'); } else { $('#status').text("User is human being . Score = " + _response.score); $('#status').removeClass('text-error').addClass('text-success'); } }, error: function (response) { $('#status').text("Error on Server!"); } }); }); }); }); })();
2. 后端代码修正
原有代码存在异步同步混用死锁、静态变量线程安全问题、HttpClient使用不当三类缺陷,修正后代码如下:
using System.Net.Http; using System.Web; using System.Web.Services; using Newtonsoft.Json; // 静态HttpClient复用避免端口耗尽 private static readonly HttpClient _httpClient = new HttpClient(); private static string apiAddress = "https://www.google.com/recaptcha/api/siteverify"; // 替换为你申请的reCaptcha v3服务端密钥 private static string recaptchaSecret = "YOUR_RECAPTCHA_SECRET_KEY"; public class ResponseToken { public bool success { get; set; } public decimal score { get; set; } public string action { get; set; } public DateTime challenge_ts { get; set; } public string hostname { get; set; } public string[] errorcodes { get; set; } } [WebMethod] public static async Task<string> CaptchaVerify(string token) { var responseString = await RecaptchaVerify(token); var response = JsonConvert.DeserializeObject<ResponseToken>(responseString); return JsonConvert.SerializeObject(response); } private static async Task<string> RecaptchaVerify(string recaptchaToken) { string url = $"{apiAddress}?secret={recaptchaSecret}&response={recaptchaToken}"; return await _httpClient.GetStringAsync(url); }
3. 配置层排查
完成代码修正后如果仍有异常,按以下顺序排查配置:
- 确认web.config中
<system.web>节点下的<httpRuntime targetFramework>版本不低于4.5,保证异步调用逻辑正常 - 确认web.config中
<system.web><webServices><protocols>节点下已添加<add name="HttpPost"/>,允许POST请求访问WebMethod - 如果服务器需通过代理访问Google,在web.config中添加代理配置:
<system.net> <defaultProxy enabled="true" useDefaultCredentials="true"> <!-- 如有固定代理地址,添加<proxy proxyaddress="http://你的代理地址:端口" /> --> </defaultProxy> </system.net>
- 确认IIS对应应用程序池的.NET Framework版本与代码编译版本一致,尝试将应用程序池标识从ApplicationPoolIdentity切换为NetworkService,排除权限导致的出站访问限制
- 开启IIS失败请求跟踪功能,定位500错误的具体堆栈信息,针对性解决剩余问题
内容的提问来源于stack exchange,提问作者Jbrown
相关产品推荐
相关产品推荐

