Проблемы с HTTP-вызовом PayPal API

Я добавил для пользователей возможность оплачивать через PayPal свои онлайн-покупки в интернет-магазине, который я создаю. Проблема возникла внезапно, когда я начал получать эту ошибку:

You must write ContentLength bytes to the request stream before calling [Begin]GetResponse. 

И код для вызова Http выглядит следующим образом:

   public string HttpCall(string NvpRequest)
        {
            string url = pEndPointURL;

            string strPost = NvpRequest + "&" + buildCredentialsNVPString();
            strPost = strPost + "&BUTTONSOURCE=" + HttpUtility.UrlEncode(BNCode);

            HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
            objRequest.Timeout = Timeout;
            objRequest.Method = "POST";
            objRequest.ContentLength = strPost.Length;

            try
            {
                using (StreamWriter myWriter = new StreamWriter(objRequest.GetRequestStream()))
                {
                    myWriter.Write(strPost.ToString());
                }
            }
            catch (Exception e)
            {

            }

            //Retrieve the Response returned from the NVP API call to PayPal. 
            HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse(); // this is the line where the exception occurs...
            string result;
            using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
            {
                result = sr.ReadToEnd();
            }

            return result;
        }

Может ли кто-нибудь помочь мне с этим? День назад все работало нормально, а теперь выдает эту ошибку?


person perkes456    schedule 23.01.2016    source источник


Ответы (3)


Итак, если кому-то интересно, я смог исправить ошибку, добавив следующую строку перед созданием веб-запроса (я смог исправить это, перейдя к Tls12 следующим образом):

`ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12`;

Ваше здоровье :-)

Изменить попробуйте это:

 public string HttpCall(string NvpRequest)
    {
        string url = pEndPointURL;

        string strPost = NvpRequest + "&" + buildCredentialsNVPString();
        strPost = strPost + "&BUTTONSOURCE=" + HttpUtility.UrlEncode(BNCode);
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
        // Try using Tls11 if it doesnt works for you with Tls
        HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
        objRequest.Timeout = Timeout;
        objRequest.Method = WebRequestMethods.Http.Post;
        objRequest.ContentLength = strPost.Length;
        try
        {

            using (StreamWriter myWriter = new StreamWriter(objRequest.GetRequestStream()))
            {
                myWriter.Write(strPost.ToString());
            }
        }
        catch (Exception e)
        {

        }

        //Retrieve the Response returned from the NVP API call to PayPal. 
        HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
        string result;
        using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
        {
            result = sr.ReadToEnd();
        }

        return result;
    }
person perkes456    schedule 23.01.2016
comment
Я также сталкиваюсь с той же проблемой с .net 4.0. Даже после того, как я добавлю ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; Я сталкиваюсь с той же проблемой. Не могли бы вы помочь? В 4.0 нет Tls12 - person sambit.albus; 09.02.2016
comment
Я попытался реализовать ваш код, но он дает ту же ошибку. - person sambit.albus; 10.02.2016
comment
Моя проблема отличалась от упомянутой в вопросе, но ваше исправление сработало для меня. В моем случае запрос PayPal отлично работает на локальном компьютере, но не работает на рабочем сервере. - person Sandeep; 06.08.2016

После нескольких потерянных часов оказалось, что это версия протокола Tls.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
person Tony Pye    schedule 01.12.2017

person    schedule
comment
Привет, я обновил свой ответ, скопируйте и вставьте мой код и попробуйте, если он работает для вас. - person perkes456; 09.02.2016