Веб-задание 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() ;

Результат:

введите описание изображения здесь

Другие вопросы по тегам