You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:40:25