gpt4 book ai didi

c# - Azure 按需 Web 作业未收到格式正确的 json 序列化字符串

转载 作者:行者123 更新时间:2023-12-02 06:47:37 24 4
gpt4 key购买 nike

我有一个按需 Web 作业,在 azure 中部署了 asp.net mvc 站点。 Web 作业尝试使用 sendgrid 发送电子邮件。

我网站的用户填写表格,可以选择附加文件,然后单击“发送”。服务器端我收集所有数据,使用 Newtonsoft.Json 将其序列化为 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)) }
}));
}
}

我的网络作业接收到序列化数据,该作业尝试使用 Newtonsoft.Json 对其进行反序列化并使用 sendgrid 发送电子邮件

在 azure 中运行 Web 作业时,出现错误未处理的异常:System.AggregateException:发生一个或多个错误。 ---> Newtonsoft.Json.JsonReaderException:无效的 JavaScript 属性标识符字符:}。路径“”,第 1 行,位置 6。位于 C:\Projects\ABCD\ABCD.Background\Program.cs 中的 ABCD.Background.Program.d__4.MoveNext():第 25 行

第 25 行是

  DeserializedCustomer customer = JsonConvert.DeserializeObject<DeserializedCustomer>(email);

现在我徒劳地尝试将调试器附加到此 webjob,因为它是 on demand

然后,我将 Web 作业函数复制到 Controller 中的私有(private)函数,以检查反序列化是否在我的 Web 应用程序中正常工作。我在本地运行了我的网络应用程序,令人惊讶的是,它有效!!!

Newtonsoft.Json 在 asp.net mvc 应用程序中可以工作,但不能在 Azure 中部署的按需 WebJob 中工作,这可能是什么问题?

帮助

更新

使用

添加了对 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 作业无法正确接收该帖子?

更新

使用 webclient 向 azure webjob 发送一个简单的对象

  new System.Collections.Specialized.NameValueCollection
{
{"email",JsonConvert.SerializeObject(new {Email = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1a707572747e757f5a697f2d7f6c34797577" rel="noreferrer noopener nofollow">[email protected]</a>"}) }
}));

日志显示相同

    [08/28/2017 11:39:45 > 1a8d37: INFO] SerializedEmail - {email}

是网络客户端还是 kudu scm?

更新

为了接收电子邮件参数,我这样做了,但我的网络作业中什么也没收到

string serializedEmail = Environment.GetEnvironmentVariable("WEBJOBS_COMMAND_ARGUMENTS");
if (string.IsNullOrWhiteSpace(serializedEmail))
{
serializedEmail = args[0];
}

仍然没有收到asp.net mvc发送的serializedEmail。

最佳答案

据我所知,如果你想将参数传递给触发的webjobs。您应该遵循以下类型。

https://{yourwebsitename}.scm.azurewebsites.net/api/triggeredwebjobs/{webjobsname}/run?arguments=yourarugment

此外,如果您使用控制台应用程序作为网络作业。控制台应用程序获取参数将删除 JSON 内的引号。

像这样。如果您将此 json 发送到 webjobs args。

{"Name":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="bad0d5d2d4ded5dffac9df8ddfcc94d9d5d7" rel="noreferrer noopener nofollow">[email protected]</a>"}

收到的字符串是:

SerializedEmail - {Name:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="157f7a7d7b717a705566702270633b767a78" rel="noreferrer noopener nofollow">[email protected]</a>}

因此,您应该使用以下代码更改转换后的字符串。

  string para = JsonConvert.SerializeObject(new Customer { Name = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6a000502040e050f2a190f5d0f1c44090507" rel="noreferrer noopener nofollow">[email protected]</a>" });

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() ;

结果:

enter image description here

关于c# - Azure 按需 Web 作业未收到格式正确的 json 序列化字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45915988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com