得到默认的 FirebaseApp 已存在

问题描述 投票:0回答:6

我制作了一个

C#
API 将通知推送到
Flutter
应用程序。

我的 API 基本上类似于下面的代码:

public async Task < IActionResult > pushNotification () {
  FirebaseApp.Create(new AppOptions() {
    Credential = GoogleCredential.FromFile("file.json")
  });
  .....
} 

我在浏览器上输入了网址“domain.com/api/controller/pushNotification”,这是第一次工作。我的扑动完美地收到通知。但第二次我得到了:

System.ArgumentException: The default FirebaseApp already exists.
   at FirebaseAdmin.FirebaseApp.Create(AppOptions options, String name)
   at FirebaseAdmin.FirebaseApp.Create(AppOptions options)

为什么?我该如何解决这个问题?

c# firebase asp.net-core firebase-admin
6个回答
14
投票

您可以通过以下方式简单地检查是否存在 FirebaseApp 实例:

if (FirebaseApp.DefaultInstance == null) { App = FirebaseApp.Create(new AppOptions() { Credential = GoogleCredential.FromFile("file.json") }); }
    

2
投票
Carset 的答案让我非常接近我所需要的。

我刚刚将构造函数更改为这样并且工作完美

public MobileMessagingClient() { var app = FirebaseApp.DefaultInstance; if (FirebaseApp.DefaultInstance == null) { app = FirebaseApp.Create(new AppOptions() { Credential = GoogleCredential.FromFile(HttpContext.Current.Server.MapPath("~/file.json")) .CreateScoped("https://www.googleapis.com/auth/firebase.messaging") }); } messaging = FirebaseMessaging.GetMessaging(app); }
    

1
投票
Firebase 在内部管理自己的客户端,您可以通过调用 Firebase 的方法来引用它,该方法向定义的或默认的“应用程序”发出请求,因为从技术上讲您可以拥有多个应用程序。

您很可能只想在 Firebase 应用程序尚不存在时启动该应用程序。我相信你可以通过检查

FirebaseApp.apps

 长度来做到这一点 - 你应该


1
投票
第一次上班。我的扑动完美地收到通知。但第二次我就得到了

您的错误消息表明您正在尝试初始化已存在的应用程序。

要解决此问题,您需要首先检查应用程序是否已初始化。在运行初始化 Firebase 应用程序的代码之前,添加一个简单的检查,例如:

public async Task < IActionResult > pushNotification () { if(appDoesNotExistYet) { FirebaseApp.Create(new AppOptions() { Credential = GoogleCredential.FromFile("file.json") }); } ..... }
    

0
投票
如果您使用没有名称的默认构造函数,它将创建默认实例。

/// <summary>Creates an app with the specified name and options.</summary> /// <returns>The newly created <see cref="T:FirebaseAdmin.FirebaseApp" /> instance.</returns> /// <exception cref="T:System.ArgumentException">If the default app instance already /// exists.</exception> /// <param name="options">Options to create the app with. Must at least contain the /// <c>Credential</c>.</param> /// <param name="name">Name of the app.</param> public static FirebaseApp Create(AppOptions options, string name) { if (string.IsNullOrEmpty(name)) throw new ArgumentException("App name must not be null or empty"); options = options ?? FirebaseApp.GetOptionsFromEnvironment(); lock (FirebaseApp.Apps) { if (FirebaseApp.Apps.ContainsKey(name)) { if (name == "[DEFAULT]") throw new ArgumentException("The default FirebaseApp already exists."); throw new ArgumentException("FirebaseApp named " + name + " already exists."); } FirebaseApp firebaseApp = new FirebaseApp(options, name); FirebaseApp.Apps.Add(name, firebaseApp); return firebaseApp; } }
因此,如果您有多个要使用的应用程序(项目),那么您需要使用带有名称的重载。您可以使用名称作为 ProjectId 或任何其他标识符。

var instance = FirebaseApp.GetInstance(appOptions.ProjectId) ?? FirebaseApp.Create(appOptions, appOptions.ProjectId);
    

0
投票
首次创建 FirebaseApp 后存储在 DefaultInstance 中

FirebaseApp app; if (FirebaseApp.DefaultInstance == null) { var file = Server.MapPath("your-acc.json"); app = FirebaseApp.Create(new AppOptions() { Credential = GoogleCredential.FromFile(file).CreateScoped("https://www.googleapis.com/auth/firebase.messaging") }); }else { app = FirebaseApp.DefaultInstance; } FirebaseMessaging messaging = FirebaseMessaging.GetMessaging(app); var result = await messaging.SendAsync(CreateNotification(title, msg, DeviceToken));
    
© www.soinside.com 2019 - 2024. All rights reserved.