我做了一个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);