Веб-задание Azure по требованию не получает правильно отформатированную сериализованную строку json
У меня есть веб-задание по требованию с сайтом asp.net mvc, развернутым в Azure. Веб-задание пытается отправить электронное письмо с помощью sendgrid.
Пользователи моего сайта заполняют форму, при желании прикрепляют файл и нажимают кнопку отправить. На стороне сервера я собираю все данные, сериализуя их в json, используя Newtonsoft.Json. И мое веб-приложение, и веб-работа используют одну и ту же версию Newtonsoft.Json.
<package id="Newtonsoft.Json" version="10.0.3" targetFramework="net47" />
Затем я публикую сериализованные данные в мою веб-работу, используя аргументы
private static void TrySendEmail(Customer customer)
{
using (WebClient client = new WebClient())
{
string responsebody = Encoding.UTF8.GetString(client.UploadValues(ConfigurationManagerExtension.WebJobUrl,
"POST",
new System.Collections.Specialized.NameValueCollection
{
{"email",JsonConvert.SerializeObject(CreateCustomerEmail(customer)) }
}));
}
}
Сериализованные данные получают мой webjob, который пытается десериализовать их с помощью Newtonsoft.Json и отправить электронную почту с помощью sendgrid.
При запуске веб-задания в Azure я получаю сообщение об ошибке Unhandled Exception: System.AggregateException: произошла одна или несколько ошибок. ---> Newtonsoft.Json.JsonReaderException: недопустимый символ идентификатора свойства JavaScript: }. Путь '', строка 1, позиция 6. в ABCD.Background.Program.d__4.MoveNext() в C:\Projects\ABCD\ABCD.Background\Program.cs: строка 25
Строка 25
DeserializedCustomer customer = JsonConvert.DeserializeObject<DeserializedCustomer>(email);
Теперь я тщетно пытался прикрепить отладчик к этому веб-заданию, так как это по требованию
Затем я просто скопировал функцию веб-задания в частную функцию моего контроллера, чтобы проверить, работает ли десериализация в моем веб-приложении. Я запустил свое веб-приложение локально и на удивление, оно работает!!!,
В чем может быть проблема Newtonsoft.Json работает в приложении asp.net mvc, но не в веб-задании по требованию, развернутом в Azure?
Помогите
Обновить
Добавлена регистрация в webjob с помощью
Console.WriteLine($"SerializedEmail - {serializedEmail}");
Результирующий след
[08/28/2017 11:39:44 > 1a8d37: SYS INFO] Status changed to Initializing
[08/28/2017 11:39:44 > 1a8d37: SYS INFO] Job directory change detected: Job file 'ABCD.Backgr.exe' timestamp differs between source and working directories.
[08/28/2017 11:39:45 > 1a8d37: SYS INFO] Run script 'ABCD.Backgr.exe' with script host - 'WindowsScriptHost'
[08/28/2017 11:39:45 > 1a8d37: SYS INFO] Status changed to Running
[08/28/2017 11:39:45 > 1a8d37: INFO] SerializedEmail - {email}
[08/28/2017 11:39:45 > 1a8d37: ERR ]
[08/28/2017 11:39:45 > 1a8d37: ERR ] Unhandled Exception: System.AggregateException: One or more errors occurred. ---> Newtonsoft.Json.JsonReaderException: Invalid JavaScript property identifier character: }. Path '', line 1, position 6.
[08/28/2017 11:39:45 > 1a8d37: ERR ] at Newtonsoft.Json.JsonTextReader.ReadUnquotedPropertyReportIfDone(Char currentChar, Int32 initialPosition)
[08/28/2017 11:39:45 > 1a8d37: ERR ] at Newtonsoft.Json.JsonTextReader.ParseUnquotedProperty()
Обновить
Почему сообщение не принимается корректно по требованию Azure Web Job?
Обновить
Отправил простой объект с веб-клиентом в лазурное веб-задание
new System.Collections.Specialized.NameValueCollection
{
{"email",JsonConvert.SerializeObject(new {Email = "johndoe@se7ev.com"}) }
}));
Журнал показывает то же самое
[08/28/2017 11:39:45 > 1a8d37: INFO] SerializedEmail - {email}
Это веб-клиент или Куду SCM?
Обновить
Чтобы получить параметр электронной почты, я делаю это, но ничего не получаю в своем веб-задании
string serializedEmail = Environment.GetEnvironmentVariable("WEBJOBS_COMMAND_ARGUMENTS");
if (string.IsNullOrWhiteSpace(serializedEmail))
{
serializedEmail = args[0];
}
До сих пор я не получаю сериализованную электронную почту, отправленную asp.net mvc.
1 ответ
Насколько я знаю, если вы хотите передать параметры запускаемых веб-заданий. Вы должны следовать ниже типов.
https://{yourwebsitename}.scm.azurewebsites.net/api/triggeredwebjobs/{webjobsname}/run?arguments=yourarugment
Кроме того, если вы используете консольное приложение в качестве веб-задания. Консольное приложение get args удалит кавычки внутри JSON.
Как это. Если вы отправите этот json в args.
{"Name":"johndoe@se7ev.com"}
Полученная строка:
SerializedEmail - {Name:johndoe@se7ev.com}
Таким образом, вы должны изменить преобразованную строку, используя приведенные ниже коды.
string para = JsonConvert.SerializeObject(new Customer { Name = "johndoe@se7ev.com" });
string escapedString = para.Replace("\"", "\\\"");
string url = @"https://{yourwebappname}.scm.azurewebsites.net/api/triggeredwebjobs/{webjobsname}/run?arguments=" + escapedString;
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.Method = "POST";
httpWebRequest.ContentLength = 0;
//you could find the user name and password in the webjobs property
string logininforation = "${username}:{password}";
byte[] byt = System.Text.Encoding.UTF8.GetBytes(logininforation);
string encode = System.Convert.ToBase64String(byt);
httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, "Basic " + encode);
HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse() ;
Результат: