Функции Azure: Тип ошибки: Исключение: System.Text.Json.JsonException: входные данные не содержат токенов JSON.C#

Место общения программистов C#
Ответить
Anonymous
 Функции Azure: Тип ошибки: Исключение: System.Text.Json.JsonException: входные данные не содержат токенов JSON.

Сообщение Anonymous »

Я получаю следующее исключение, когда использую JsonSerializer.Deserialize в своей функции Azure. Я создал небольшую функцию Azure для целей тестирования, и она всегда терпит неудачу с одним и тем же исключением. Невозможно ли использовать JsonSerializer.Deserialize в моей функции DeleteAccountSendEmail?
Каков самый простой способ решить эту проблему, если я не могу использовать JsonSerializer.Deserialize, потому что я всегда получаю исключение в этой строке (это строка 444 в моем проекте в коде Visual Studio):

Код: Выделить всё

FunctionExecutionContext context = JsonSerializer.Deserialize(await req.ReadAsStringAsync());
Полный код:

Код: Выделить всё

using System;
using System.Threading.Tasks;
using System.Text.Json;
using System.Collections.Generic;
using PlayFab;
using PlayFab.AdminModels;
using System.IO;
using System.Net;
using PlayFab.Samples;
using System.Linq;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;

namespace My.Functions
{
public class Result
{
public bool FunctionSuccessful { get; set; }
public string Errorline1 { get; set; }
public string Errorline2 { get; set; }
public string Errorline3 { get; set; }
public string Errorline4 { get; set; }
public string Errorline5 { get; set; }
public string Errorline6 { get; set; }
public bool Isexpired { get; set; }
public bool Isbanned { get; set; }
public bool Zummenuweiterleitenmoeglich { get; set; }
public string Entityid { get; set; }
public string Entitytype { get; set; }
public string Playersessionticket { get; set; }
public string Playfabid { get; set; }
public DateTime Playersessionticketexpdate { get; set; }
}

public class NewFunction
{
private readonly ILogger log;

public NewFunction(ILogger logger)
{
log = logger;
}

[Function("DeleteAccountSendEmail")]
public async Task DeleteAccountSendEmail(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestData req)
{
FunctionExecutionContext context = JsonSerializer.Deserialize(await req.ReadAsStringAsync());
var args = context.FunctionArgument;
string language = args["Language"];
log.LogInformation($"MyLanguage = {language}");
string loginemail = args["Loginemail"];
log.LogInformation($" = {loginemail}");

bool updateaccountrecsuccessful = false;
string errorline1 = string.Empty;
string errorline2 = string.Empty;
string errorline3 = string.Empty;
string errorline4 = string.Empty;
string errorline5 = string.Empty;
string errorline6 = string.Empty;
bool isbanned = false;
bool isexpired = false;

log.LogInformation($"FunctionSuccessful: = {updateaccountrecsuccessful}");
var result1 = new Result
{
FunctionSuccessful = updateaccountrecsuccessful,
Errorline1 = string.Empty,
Errorline2 = string.Empty,
Errorline3 = string.Empty,
Errorline4 = string.Empty,
Errorline5 = string.Empty,
Errorline6 = string.Empty,
Isexpired = isexpired,
Isbanned = isbanned
};
var res1 = req.CreateResponse(HttpStatusCode.OK);
res1.Headers.Add("Content-Type", "application/json");
await res1.WriteStringAsync(JsonSerializer.Serialize(result1));
return res1;
}
}
}
Ошибка:

Выполнение функции.DeleteAccountSendEmail (Причина='Эта функция была вызвана программно через API хоста.', Id=d09b0bb2-5bde-49fe-8a48-846a2e98fd29)
Ввод не содержит любые токены JSON. Ожидается, что ввод начнется с действительного токена JSON, если isFinalBlock имеет значение true. НомерЛинии: 0 | BytePositionInLine: 0.
Результат: Тип ошибки: Исключение: System.Text.Json.JsonException: Входные данные не содержат токенов JSON. Ожидается, что ввод начнется с действительного токена JSON, если isFinalBlock имеет значение true. Путь: $ | НомерЛинии: 0 | BytePositionInLine: 0. ---> System.Text.Json.JsonReaderException: входные данные не содержат токенов JSON. Ожидается, что ввод начнется с действительного токена JSON, если isFinalBlock имеет значение true. НомерЛинии: 0 | BytePositionInLine: 0. в System.Text.Json.ThrowHelper.ThrowJsonReaderException(Utf8JsonReader& json, ресурс ExceptionResource, Byte nextByte, ReadOnlySpan

Код: Выделить всё

1 bytes) at System.Text.Json.Utf8JsonReader.Read() at System.Text.Json.Serialization.JsonConverter
1.ReadCore(Utf8JsonReader& Reader, параметры JsonSerializerOptions, ReadStack& состояние) --- Конец трассировки внутреннего стека исключений --- в System.Text.Json.ThrowHelper.ReThrowWithPath(ReadStack& state, JsonReaderException ex) в System.Text.Json.Serialization.JsonConverter

Код: Выделить всё

1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state) at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan
1 utf8Json, JsonTypeInfo

Код: Выделить всё

1 jsonTypeInfo, Nullable
1 actualByteCount) в System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan

Код: Выделить всё

1 json, JsonTypeInfo
1 jsonTypeInfo) в System.Text.Json.JsonSerializer.Deserialize[TValue](параметры String json, JsonSerializerOptions) в My.Functions.NewFunction.DeleteAccountSendEmail(HttpRequestData req) в C:\Users\Name\Documents\NewAzureFunctionsDevelopment\NewFunction.cs:line 444 в NewAzureFunctions.DirectFunctionExecutor.ExecuteAsync (контекст FunctionContext) в C:\Users\Name\Documents\NewAzureFunctionsDevelopment\obj\Release\net8.0\Microsoft.Azure.Functions.Worker.Sdk.Generators\Microsoft.Azure.Functions.Worker.Sdk.Generators.FunctionExecutorGenerator\GeneratedFunctionExecutor.g.cs:строка 52 в Microsoft.Azure.Functions.Worker.OutputBindings.OutputBindingsMiddleware.Invoke(контекст FunctionContext, FunctionExecutionDelegate следующий) в D:\a_work\1\s\src\DotNetWorker.Core\OutputBindings\OutputBindingsMiddleware.cs:строка 13 в Microsoft.Azure.Functions.Worker.FunctionsApplication.InvokeFunctionAsync(контекст FunctionContext) в D:\a_work\1\s\src\DotNetWorker.Core\FunctionsApplication.cs:строка 96 в Microsoft.Azure.Functions.Worker.Handlers.IndictionHandler.InvokeAsync(запрос InvokeRequest) в D:\a_work\1\s\src\DotNetWorker.Grpc\Handlers\InfectionHandler.cs:line 88 Стек: в System.Text.Json.ThrowHelper.ReThrowWithPath(ReadStack& state, JsonReaderException ex) в System.Text.Json.Serialization.JsonConverter

Код: Выделить всё

1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state) at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan
1 utf8Json, JsonTypeInfo

Код: Выделить всё

1 jsonTypeInfo, Nullable
1 actualByteCount) в System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan

Код: Выделить всё

1 json, JsonTypeInfo
1 jsonTypeInfo) в System.Text.Json.JsonSerializer.Deserialize[TValue](параметры String json, JsonSerializerOptions) в My.Functions.NewFunction.DeleteAccountSendEmail(HttpRequestData req) в C:\Users\Name\Documents\NewAzureFunctionsDevelopment\NewFunction.cs:line 444 в NewAzureFunctions.DirectFunctionExecutor.ExecuteAsync (контекст FunctionContext) в C:\Users\Name\Documents\NewAzureFunctionsDevelopment\obj\Release\net8.0\Microsoft.Azure.Functions.Worker.Sdk.Generators\Microsoft.Azure.Functions.Worker.Sdk.Generators.FunctionExecutorGenerator\GeneratedFunctionExecutor.g.cs:строка 52 в Microsoft.Azure.Functions.Worker.OutputBindings.OutputBindingsMiddleware.Invoke(контекст FunctionContext, FunctionExecutionDelegate следующий) в D:\a_work\1\s\src\DotNetWorker.Core\OutputBindings\OutputBindingsMiddleware.cs:строка 13 в Microsoft.Azure.Functions.Worker.FunctionsApplication.InvokeFunctionAsync(контекст FunctionContext) в D:\a_work\1\s\src\DotNetWorker.Core\FunctionsApplication.cs:строка 96 в Microsoft.Azure.Functions.Worker.Handlers.IndictionHandler.InvokeAsync(запрос InvokeRequest) в D:\a_work\1\s\src\DotNetWorker.Grpc\Handlers\IndictionHandler.cs:line 88

Я использую этот код для вызова моей функции Azure:

Код: Выделить всё

public static async Task  DeleteAccountSendEmailAzure(this string language, string loginemail, string sessionticket, string deviceid, string entityid, string entitytype)
{
bool addedcredentials = false;
string errorline1 = string.Empty;
string errorline2 = string.Empty;
string errorline3 = string.Empty;
string errorline4 = string.Empty;
string errorline5 = string.Empty;
string errorline6 = string.Empty;
bool isbanned = false;
bool isexpired = false;

var result = await PlayFabCloudScriptAPI.ExecuteFunctionAsync(new ExecuteFunctionRequest()
{
Entity = new PlayFab.CloudScriptModels.EntityKey()
{
Id = entityid,
Type = entitytype,
},
FunctionName = "DeleteAccountSendEmail",
FunctionParameter = new { SessionTicket = sessionticket, Deviceid = deviceid, Loginemail = loginemail, Language = language },
GeneratePlayStreamEvent = true
});

if (result.Error != null)
{
var errors = OnPlayFabError(result.Error, language);
errorline1 = errors[0];
errorline2 = errors[1];
errorline3 = errors[2];
errorline4 = errors[3];
errorline5 = errors[4];
errorline6 = errors[5];

if (result.Error.Error == PlayFabErrorCode.NotAuthenticated)
{
isexpired = true;
}

if (result.Error.Error == PlayFabErrorCode.AccountBanned)
{
isbanned = true;
}
}
else
{
var data = PlayFab.PluginManager.GetPlugin(PluginContract.PlayFab_Serializer).DeserializeObject(result.Result.FunctionResult.ToString());
if (data.TryGetValue("functionSuccessful", out object a))
{
addedcredentials = Convert.ToBoolean(a);
}
if (data.TryGetValue("errorline1", out object b))
{
errorline1 = Convert.ToString(b);
}
if (data.TryGetValue("errorline2", out object c))
{
errorline2 = Convert.ToString(c);
}
if (data.TryGetValue("errorline3", out object d))
{
errorline3 = Convert.ToString(d);
}
if (data.TryGetValue("errorline4", out object e))
{
errorline4 = Convert.ToString(e);
}
if (data.TryGetValue("errorline5", out object f))
{
errorline5 = Convert.ToString(f);
}
if (data.TryGetValue("errorline6", out object g))
{
errorline6 = Convert.ToString(g);
}
if (data.TryGetValue("isexpired", out object h))
{
isexpired = Convert.ToBoolean(h);
}
if (data.TryGetValue("isbanned", out object i))
{
isbanned = Convert.ToBoolean(i);
}
}
return (isbanned, isexpired, addedcredentials, errorline1, errorline2, errorline3, errorline4, errorline5, errorline6);
}
РЕДАКТИРОВАНИЕ:
Я снова попытался вызвать свою функцию Azure и вот что я нашел в своей учетной записи PlayFab:

{
"SchemaVersion": "2.0.1",
"FullName": {
"Namespace": "playfab.functions",
"Имя": "function_executed"
},
"Id": "ee1b53290a8a4cc9af3558058b92abb5",
"Timestamp": "2025-12-30T22:41:18.2403127Z",
"Entity": {
"Id": "E90B78808A2382E0",
"Тип": "title_player_account"
},
"EntityProfile": null,
"Инициатор": {
"Id": "E90B78808A2382E0",
"Тип": "title_player_account"
},
"OriginInfo": {
"Id": null,
"Timestamp": null,
"CustomTags": null,
"Key": null
},
"Контекст": null,
"Полезная нагрузка": "{"Source":"API","FunctionName":"DeleteAccountSendEmail","ExecutionTimeMilliсекунды":0,"Result":{"ErrorCode":"CloudScriptAzureFunctionsHTTPRequestError","Message":"Вызов
функции облачного скрипта DeleteAccountSendEmail завершился неудачно с HTTP
статусом InternalServerError и телом ответа
","ErrorAndMessage":{"Item1":"CloudScriptAzureFunctionsHTTPRequestError","Item2":"Вызов
функции облачного скрипта DeleteAccountSendEmail завершился неудачей с HTTP
статусом InternalServerError и телом ответа
"}},"ResultTooLarge":false}",
"EntityLineage": {
"namespace": "4CE2E85814BA15CA",
"title": "XXXXX",
"master_player_account": "57440D2996790D06",
"title_player_account": "E90B78808A2382E0"
},
"PayloadContentType": 1,
"ExperimentVariants": null

РЕДАКТИРОВАТЬ:
Я изменил свой код, но log.LogInformation($"req = {s}"); не отображает параметры содержимого/функции на портале Azure. Как отобразить параметры функции (SessionTicket, Deviceid, Loginemail, Language) на портале Azure? Я просто хочу узнать, верны ли параметры функции? Но обычно они должны быть правильными.

Код: Выделить всё

 [Function("DeleteAccountSendEmail")]
public async Task DeleteAccountSendEmail(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestData req)
{
var s = await req.ReadAsStringAsync();
log.LogInformation($"req = {s}");
//       FunctionExecutionContext context = JsonSerializer.Deserialize(await req.ReadAsStringAsync());
//     var args = context.FunctionArgument;
//       string language = args["Language"];
//     log.LogInformation($"MyLanguage = {language}");
//     string loginemail = args["Loginemail"];
//   log.LogInformation($" = {loginemail}");

bool updateaccountrecsuccessful = false;
string errorline1 = string.Empty;
string errorline2 = string.Empty;
string errorline3 = string.Empty;
string errorline4 = string.Empty;
string errorline5 = string.Empty;
string errorline6 = string.Empty;
bool isbanned = false;
bool isexpired = false;

log.LogInformation($"FunctionSuccessful: = {updateaccountrecsuccessful}");
var result1 = new Result
{
FunctionSuccessful = updateaccountrecsuccessful,
Errorline1 = string.Empty,
Errorline2 = string.Empty,
Errorline3 = string.Empty,
Errorline4 = string.Empty,
Errorline5 = string.Empty,
Errorline6 = string.Empty,
Isexpired = isexpired,
Isbanned = isbanned
};
var res1 = req.CreateResponse(HttpStatusCode.OK);
res1.Headers.Add("Content-Type", "application/json");
await res1.WriteStringAsync(JsonSerializer.Serialize(result1));
return res1;
}
Изображение


Подробнее здесь: https://stackoverflow.com/questions/798 ... ion-the-in
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»