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

使用C#创建Firebase规则时出现System.NullReferenceException如何修复?

问题

我为Firebase规则服务创建了认证函数,并调用服务实例来创建Firebase规则集,但返回错误:System.NullReferenceException: Object reference not set to an instance of an object。拆分对象后,空引用异常出现在创建Source实例的代码行。

原始代码

using Google.Apis.FirebaseRules.v1;
using Ruleset = Google.Apis.FirebaseRules.v1.Data.Ruleset;
using Source = Google.Apis.FirebaseRules.v1.Data.Source;
using File = Google.Apis.FirebaseRules.v1.Data.File;

private static FirebaseRulesService _firebaseRulesService;


public static void IntializeFirebaseRules() {
    GoogleCredential credential = GoogleCredential.GetApplicationDefault();
    if (CloudManager.Credential.IsCreateScopedRequired)
    {
        credential = CloudManager.Credential.CreateScoped(FirebaseRulesService.Scope.CloudPlatform);
    }
    _firebaseRulesService = new FirebaseRulesService(
    new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = CloudManager.ApplicationName

        });
}
    

 public static async  void AddRuleset()
{
    Ruleset myRuleset = new Ruleset {
    new Source {
        Files = {
        new File {
        Name = "firestore.rules",
        Content = "service cloud.firestore {" +
        "match /databases/{database}/documents {" +
        "match /users/{userId}{" +
        "allow read: if (request.auth.uid == userId);" +
        "}" +
        "match /licenses/{accountId} {" +
        "allow read: if isAccountOwner(accountId);" +
        "}" +
        "}"+"}",
            }
            }
        };
    };


    _firebaseRulesService.Projects.Rulesets.Create(myRuleset , "projects/" + CloudManager.ProjectId);
}

修改后的代码(异常出现在Source实例创建行)

File myFile =  new File {
    Name = "firestore.rules",
    Content = "service cloud.firestore {" +
    "match /databases/{database}/documents {" +
    "match /users/{userId}{" +
    "allow read: if (request.auth.uid == userId);" +
    "}" +
    "function doc(subpath) {" +
    "return get(/databases/$(database)/documents/$(subpath)).data;" +
    "}" +
    "function isAccountOwner(accountId) {" +
    "return request.auth.uid == accountId" + 
    "|| doc(/users/$(request.auth.uid)).accountId == accountId;" +
    "}" +
    "match /licenses/{accountId} {" +
    "allow read: if isAccountOwner(accountId);" +
    "}" +
    "}"+"}",
};
Source mySource = new Source {
    Files = {
        myFile
    }  
};
Ruleset myRuleset = new Ruleset {
    Source = mySource
};

_firebaseRulesService.Projects.Rulesets.Create(myRuleset , "projects/" + CloudManager.ProjectId);
解决方案

空引用异常的核心原因是**Source类的Files集合未被初始化**。在C#中使用集合初始化语法(Files = { myFile })时,要求集合本身已经被实例化,否则会触发空引用错误。

具体修复步骤:

  1. 显式初始化Files集合
    创建Source实例时,先将Files初始化为新的List<File>实例,再添加文件对象:

    Source mySource = new Source {
        Files = new List<File> { myFile }
    };
    
  2. 排查其他潜在空引用点

    • 确保_firebaseRulesService已通过IntializeFirebaseRules()方法正确初始化,避免调用Create接口时服务实例为空。
    • 验证CloudManager.ProjectId不为空或空字符串,保证请求的项目ID合法有效。
  3. 修正原始代码的语法错误
    原始代码中Ruleset初始化器存在语法错误,直接嵌套new Source不符合C#对象初始化规则,正确写法应为给Ruleset的Source属性赋值:

    Ruleset myRuleset = new Ruleset {
        Source = new Source {
            Files = new List<File> {
                new File {
                    Name = "firestore.rules",
                    Content = "// 规则内容..."
                }
            }
        }
    };
    
  4. 规范异步方法写法
    AddRuleset声明为async void仅适用于事件处理程序,建议改为async Task以支持异步等待和错误捕获,同时调用ExecuteAsync()执行异步请求:

    public static async Task AddRuleset()
    {
        // 代码逻辑...
        await _firebaseRulesService.Projects.Rulesets.Create(myRuleset, "projects/" + CloudManager.ProjectId).ExecuteAsync();
    }
    

内容的提问来源于stack exchange,提问作者Samaritan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:25:29