ASP.NET部署IIS后调用Google Sheets API发送请求报错求助
Google Sheets API部署到IIS后请求失败问题
本地Visual Studio内置IIS运行时,代码可正常读取Google Sheets表格数据,但部署到独立IIS服务器后出现错误:Error al enviar la solicitud(发送请求时出错),异常信息未明确问题位置,推测是内置IIS与独立IIS的配置差异导致。
代码示例
try { string path = Server.MapPath("Updating"); ServiceAccountCredential credential; string[] Scopes = { SheetsService.Scope.Spreadsheets }; string serviceAccountEmail = "account.com"; string jsonfile = Path.Combine(path, "cred.json"); using (Stream stream = new FileStream(jsonfile, FileMode.Open, FileAccess.Read, FileShare.Read)) { credential = (ServiceAccountCredential) GoogleCredential.FromStream(stream).UnderlyingCredential; var initializer = new ServiceAccountCredential.Initializer(credential.Id) { User = serviceAccountEmail, Key = credential.Key, Scopes = Scopes }; credential = new ServiceAccountCredential(initializer); } var service = new SheetsService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = ApplicationName, }); String spreadsheetId = "1zkqBR9svQInKwM9hqPzrzhOFQB...."; string range = "Info!A:D"; string firmasRange = "Info!A:D"; SpreadsheetsResource.ValuesResource.GetRequest request = service.Spreadsheets.Values.Get(spreadsheetId, range); var response = request.Execute(); // 错误疑似发生在此处 IList<IList<Object>> values = response.Values; sincronizeSheet(values); }
堆栈跟踪信息
CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) en Google.Apis.Auth.OAuth2.ServiceAccountCredential.d__33.MoveNext() --- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción --- en System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) en Google.Apis.Auth.OAuth2.TokenRefreshManager.d__12.MoveNext() --- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción --- en System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) en Google.Apis.Auth.OAuth2.TokenRefreshManager.<g__LogException|10_0>d.MoveNext() --- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción --- en System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() en Google.Apis.Requests.ClientServiceRequest`1.Execute() en Xerox_Mailroom.CoordinarCelular.ButtonSincronizar_Click(Object sender, EventArgs e)
排查与解决方法
1. 文件权限问题
IIS应用池身份没有读取cred.json文件的权限是最常见原因。
- 操作步骤:找到
Updating文件夹→右键属性→安全→添加IIS应用池对应的身份(格式:IIS AppPool\你的应用池名称)→赋予读取权限。
2. 网络/代理配置
服务器网络环境可能需要代理才能访问外网,而本地Visual Studio自动使用系统代理,IIS未配置。
- 解决:在代码中添加代理配置,或在服务器IIS设置中配置全局代理,确保能访问
https://sheets.googleapis.com。示例代码:
var handler = new HttpClientHandler { Proxy = new WebProxy("http://你的代理地址:端口"), UseProxy = true }; var service = new SheetsService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = ApplicationName, HttpClientFactory = new HttpClientFactory(() => new HttpClient(handler)) });
3. SSL证书信任问题
服务器缺少Google API的SSL根证书信任,导致请求时证书验证失败。
- 临时测试解决:在代码中禁用证书验证(生产环境不推荐):
var handler = new HttpClientHandler { ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true }; var service = new SheetsService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = ApplicationName, HttpClientFactory = new HttpClientFactory(() => new HttpClient(handler)) });
- 生产环境解决:导入Google对应的CA根证书到服务器的受信任根证书存储区。
4. 应用池身份权限限制
IIS默认应用池身份(如ApplicationPoolIdentity)权限较低,无法发起外网请求。
- 操作步骤:打开IIS管理器→找到对应应用池→高级设置→将标识改为
LocalSystem或具有外网访问权限的域账号,重启应用池测试。
代码优化建议
原凭证初始化代码可简化,避免冗余操作:
// 简化后的凭证创建 var credential = GoogleCredential.FromFile(jsonfile) .CreateScoped(Scopes) .UnderlyingCredential as ServiceAccountCredential;
内容的提问来源于stack exchange,提问作者Faqundo
相关产品推荐
相关产品推荐

