
Ich habe ein seltsames Verhalten, ich habe einige HTTP-Funktionen in Firebase Cloud Functions. Sie funktionieren einwandfrei, aber es gibt Tage, an denen sie für eine Weile den Status 500 zurückgeben, dann für ein paar Minuten wieder normal funktionieren und dann wieder den Status 500 zurückgeben. Dieses Verhalten bleibt den ganzen Tag bestehen.
Das Seltsamste daran ist, dass ich keine Fehlermeldungen auf meinem Stack-Treiber bekomme. Tatsächlich gibt es keine Einträge zu diesen Aufrufen. Es ist, als würden die Aufrufe die Dienste von Google irgendwie nicht erreichen oder sie werden einfach abgelehnt und es gibt keine Einträge dazu.
Ich poste die Implementierung einer der am häufigsten verwendeten Funktionen in meiner Anwendung:
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp()
exports.changeOrderStatus_1 = functions.https.onRequest((request, response) =>
{
//Check Headers
const clientID = request.get('ClientID');
if(clientID === null || clientID === undefined || clientID === "")
{
console.error(new Error('clientID not provided.'));
return response.status(500).send('clientID not provided.');
}
const unitID = request.get('UnitID');
if(unitID === null || unitID === undefined || unitID === "")
{
console.error(new Error('unitID not provided.'));
return response.status(500).send('unitID not provided.');
}
//Check body
const orderID = request.body.OrderID;
if(orderID === null || orderID === undefined || orderID === "")
{
console.error(new Error('orderID not provided.'));
return response.status(500).send('orderID not provided.');
}
const orderStatus = request.body.OrderStatus;
if(orderStatus === null || orderStatus === undefined || orderStatus === "")
{
console.error(new Error('orderStatus not provided.'));
return response.status(500).send('orderStatus not provided.');
}
const orderStatusInt = Number.parseInt(String(orderStatus));
const notificationTokenString = String(request.body.NotificationToken);
const customerID = request.body.CustomerID;
const promises: any[] = [];
const p1 = admin.database().ref('Clients/' + clientID + '/UnitData/'+ unitID +'/FreshData/Orders/' + orderID + '/Status').set(orderStatusInt);
promises.push(p1);
if(notificationTokenString !== null && notificationTokenString.length !== 0 && notificationTokenString !== 'undefined' && !(customerID === null || customerID === undefined || customerID === ""))
{
const p2 = admin.database().ref('Customers/' + customerID + '/OrderHistory/' + orderID + '/Status').set(orderStatusInt);
promises.push(p2);
if(orderStatusInt > 0 && orderStatusInt < 4)
{
const p3 = admin.database().ref('Customers/' + customerID + '/ActiveOrders/' + orderID).set(orderStatusInt);
promises.push(p3);
}
else
{
const p4 = admin.database().ref('Customers/' + customerID + '/ActiveOrders/' + orderID).set(null);
promises.push(p4);
}
let title = String(request.body.NotificationTitle);
let message = String(request.body.NotificationMessage);
if(title === null || title.length === 0)
title = "?????";
if(message === null || message.length === 0)
message = "?????";
const payload =
{
notification:
{
title: title,
body: message,
icon: 'notification_icon',
sound : 'default'
}
};
const p5 = admin.messaging().sendToDevice(notificationTokenString, payload);
promises.push(p5);
}
return Promise.all(promises).then(r => { return response.status(200).send('success') })
.catch(error =>
{
console.error(new Error(error));
return response.status(500).send(error)
});
})
Und so rufe ich es auf, die Client-Anwendung läuft auf der Xamarin Forms-App unter Verwendung der Sprache C#:
static HttpClient Client;
public static void Initialize()
{
Client = new HttpClient();
Client.BaseAddress = new Uri("My cloud functions adress");
Client.DefaultRequestHeaders.Add("UnitID", UnitService.GetUnitID());
Client.DefaultRequestHeaders.Add("ClientID", AuthenticationService.GetFirebaseAuth().User.LocalId);
}
public static async Task<bool> CallChangeOrderStatus(OrderHolder holder, int status)
{
Debug.WriteLine("CallChangeOrderStatus: " + status);
try
{
var content = new Dictionary<string, string>();
content.Add("OrderID", holder.Order.ID);
content.Add("OrderStatus", status.ToString());
if (!string.IsNullOrEmpty(holder.Order.NotificationToken) && NotificationService.ShouldSend(status))
{
content.Add("CustomerID", holder.Order.SenderID);
content.Add("NotificationToken", holder.Order.NotificationToken);
content.Add("NotificationTitle", NotificationService.GetTitle(status));
content.Add("NotificationMessage", NotificationService.GetMessage(status));
}
var result = await Client.PostAsync("changeOrderStatus_1", new FormUrlEncodedContent(content));
return result.IsSuccessStatusCode;
}
catch (HttpRequestException exc)
{
#if DEBUG
ErrorHandlerService.ShowErrorMessage(exc);
#endif
Crashes.TrackError(exc);
return false;
}
}
Diese Funktionen werden jeweils mehrere Male pro Minute aufgerufen, können aber bis zu einer Stunde lang nicht aufgerufen werden.
Ich habe die Anfragen von Mobilfunkverbindungen, WLAN-Verbindungen, Kabelverbindungen und von verschiedenen Internetanbietern gesendet, und das Problem besteht trotzdem weiterhin.
Mache ich etwas falsch? Übersehe ich etwas? Liegt es an Instabilitäten der Google-Server?
Antwort1
Es scheint, als ob gestern einbekanntes Problem ist aufgetreten, ich habe das gleiche Verhalten in meinen Cloud-Funktionen festgestellt und das Support-Team hat diese Informationen erwähnt. Wenn Ihr Problem immer noch nicht gelöst ist, empfehle ich Ihnen, sich an denGCP-Supportteamdamit sie Ihr Projekt genau unter die Lupe nehmen und Sie weiter dazu beraten können :)