.Net HttpClient无效的URI:Uri字符串太长

时间:2019-01-16 22:06:39

标签: .net http-post multipartform-data 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)

它工作得很好,直到几天前我注意到它开始引发以下异常。不幸的是,它并不一致,因为它将发送30/40封电子邮件,但会抛出另外10封电子邮件的异常,并且每天的异常数量和针对不同人员的数量有所不同。我知道以多重形式发送的数据很大,但这不应该是uri的一部分,除非有人收到1500个字符的电子邮件,否则uri永远不会太长。有谁知道可能会发生什么?感谢您的帮助。

  

System.UriFormatException:无效的URI:Uri字符串太长。在System.Uri.EscapeDataString(String input,Int32 start,Int32 end,Char [] dest,Int32&destPos,Boolean isUriString,Char force1,Char force2,Char rsvd)处System.Uri.EscapeDataString(String stringToEscape) System.Net.Http.FormUrlEncodedContent.GetContentByteArray(IEnumerable 1 nameValueCollection) at System.Net.Http.FormUrlEncodedContent..ctor(IEnumerable 1 nameValueCollection)中的.Http.FormUrlEncodedContent.Encode(字符串数据),位于PardotDataAccessLibrary.PardotDataAccess.d__9.MoveNext()

3 个答案:

答案 0 :(得分:2)

这是几乎所有.NET风格的known issue。即使异常消息显示“无效的URI”,您也会从堆栈跟踪中注意到它是从FormUrlEncodedContent抛出的。因此,请求的 body 是问题所在。

解决此问题的一种方法是使用Flurl(免责声明:我是作者)提出请求。我已经在Flurl的实现中明确fixed这个问题。作为奖励,它将大大清理您的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
    });

答案 1 :(得分:-1)

在使用“ MultipartFormDataContent”时,我遇到了类似的问题,并且我不建议使用它。

现在,我为此使用JSON。

您可能会在这里找到更多信息:https://stackoverflow.com/a/38440832/6488079

希望有帮助!

答案 2 :(得分:-1)

很抱歉,发布此消息后的第二天,我找到了一个修复程序,然后继续忽略该帖子。我将api调用更改为sync,此后再也没有看到错误。我认为,因为我必须使用的api将您限制为5个并发调用,因此它们可能是异步的,这会导致大量的调用并因此而出错。