.Net HttpClient Неверный URI: строка Uri слишком длинная - PullRequest
0 голосов
/ 17 января 2019

Приведенный ниже код используется для отправки писем через API pardot.

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.UriHelper.EscapeString (ввод String, начало Int32, конец Int32, Char [] dest, Int32 & destPos, логическое значение isUriString, Char force1, Char force2, Char rsvd) в System.Uri.EscapeDataString (String stringToEscape) в System.Net .Http.FormUrlEncodedContent.Encode (строковые данные) в System.Net.Http.FormUrlEncodedContent.GetContentByteArray (IEnumerable 1 nameValueCollection) at System.Net.Http.FormUrlEncodedContent..ctor(IEnumerable 1 nameValueCollection) в PardotDataAccessLibrary.PardotDataAccess.dxt9.Me

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Это известная проблема практически во всех разновидностях .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
    });
0 голосов
/ 30 января 2019

Извините, я нашел исправление для меня на следующий день после публикации и перестал забывать о публикации. Я изменил вызов API на синхронный и с тех пор не видел ошибки. Я думаю, потому что API, который я должен использовать, ограничивает вас 5 одновременными вызовами, возможно, их асинхронный вызов вызвал количество обращений к вызовам и, следовательно, ошибки.

0 голосов
/ 17 января 2019

У меня была похожая проблема при использовании «MultipartFormDataContent», и я бы не рекомендовал его использовать.

Теперь я использую JSON для этого.

Вы можете найти больше информации прямо здесь: https://stackoverflow.com/a/38440832/6488079

Надеюсь, это поможет!

...