得到默认的FirebaseApp已经存在



我做了一个C#API来推送通知到Flutter应用程序。

我的API基本上像下面的代码:

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

I past url "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)

为什么?我怎样才能解决这个问题呢?

你可以通过

查看是否有一个FirebaseApp实例
if (FirebaseApp.DefaultInstance == null)
{
App = FirebaseApp.Create(new AppOptions()
{
Credential = GoogleCredential.FromFile("file.json")
});
}

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);
}

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

你很可能只在Firebase应用程序不存在的情况下才启动它。我相信你可以通过检查FirebaseApp.apps长度来做到这一点-你应该

第一次工作。我的飞机完全收到通知。但是第二次我得到

你的错误信息说你试图初始化一个已经存在的应用程序。

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

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

如果您使用默认构造函数而不指定名称,它将创建默认实例。

/// <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;
}
}

因此,如果你想使用多个应用程序(项目),那么你需要使用带有name的重载。您可以使用name作为投影或任何其他标识符。

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

相关内容

最新更新