Mat*_*rth 2 .net multipartform-data http-post dotnet-httpclient
以下代码用于通过 pardot api 发送电子邮件。
if (ConfigurationManager.AppSettings.Count > 0)
{
uri = ConfigurationManager.AppSettings["PardotURI"].ToString() + "email/version/4/do/send/prospect_email/" + email;
uri += "?user_key=" + ConfigurationManager.AppSettings["PardotUserKey"].ToString();
uri += "&api_key=" + GetAPIKey() + "&campaign_id=" + GetPardotCampaign("Capis News");
uri += "&from_email=" + ConfigurationManager.AppSettings["FromEmail"].ToString();
uri += "&from_name=" + ConfigurationManager.AppSettings["FromName"].ToString();
uri += "&name=FlyNews - " + DateTime.Now.ToString("MM/dd/yyy h:mm tt");
uri += "&subject=CAPIS: Client Holdings News " + DateTime.Today.ToString("MM/dd/yyyy");
}
try
{
MultipartFormDataContent data = new MultipartFormDataContent();
data.Add(new StringContent(htmlContent), "html_content");
data.Add(new StringContent(textContent), "text_content");
await client.PostAsync(uri, data);
client.Dispose();
}
catch(Exception ex)
Run Code Online (Sandbox Code Playgroud)
它运行良好,直到几天前我注意到它开始抛出以下异常。不幸的是,它并不一致,因为它会发送 30/40 封电子邮件,但会为其他 10 封邮件抛出异常,并且每天的异常数量因人而异。我知道我在 multipartform 中发送的数据很大,但这不应该是 uri 的一部分,除非有人有 1500 个字符的电子邮件,否则 uri 不应太长。有没有人知道会发生什么?我很感激任何帮助。
System.UriFormatException:无效的 URI:Uri 字符串太长。在 System.UriHelper.EscapeString(String input, Int32 start, Int32 end, Char[] dest, Int32& destPos, Boolean isUriString, Char force1, Char force2, Char rsvd) at System.Uri.EscapeDataString(String stringToEscape) at System.Net .Http.FormUrlEncodedContent.Encode(String data) at System.Net.Http.FormUrlEncodedContent.GetContentByteArray(IEnumerable
1 nameValueCollection) at System.Net.Http.FormUrlEncodedContent..ctor(IEnumerable1 nameValueCollection) at PardotDataAccessLibrary.PardotDataAccess.d__9.MoveNext()
这是几乎所有版本的 .NET 中的一个已知问题。即使异常消息显示“无效 URI”,您也会从堆栈跟踪中注意到它是从FormUrlEncodedContent. 所以请求的正文是问题所在。
解决此问题的一种方法是使用Flurl(免责声明:我是作者)发出请求。我已经在 Flurl 的实现中明确修复了这个问题。作为奖励,它将显着清理您的 URL 构建和内容构建代码:
await ConfigurationManager.AppSettings["PardotURI"]
.AppendPathSegments("email/version/4/do/send/prospect_email", email)
.SetQueryParams(new {
user_key = ConfigurationManager.AppSettings["PardotUserKey"],
pi_key = GetAPIKey() + "&campaign_id=" + GetPardotCampaign("Capis News");
from_email = ConfigurationManager.AppSettings["FromEmail"],
from_name = ConfigurationManager.AppSettings["FromName"],
name = "FlyNews - " + DateTime.Now.ToString("MM/dd/yyy h:mm tt"),
subject = "CAPIS: Client Holdings News " + DateTime.Today.ToString("MM/dd/yyyy")
})
.PostUrlEncodedAsync(new {
html_content = htmlContent,
text_content = textContent
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2564 次 |
| 最近记录: |