Метод POST с вложением файла

ASP.NET
  1. 4 года назад
    Добавлено 4 года назад Alexandr_Erohin

    Алекс, помоги пожалуйста, облазил весь инет. В яндекс кассе , нужно методом POST отправить крипто сертификат какой то . Вообщем они говорит что что отправлять его так же как HTML форму пост методом с прикрепленным файлом...
    До этого я подключил к сайту оплату через яндекс пост методом вот такой код:

    private static String PreparePOSTForm(string url, NameValueCollection data)
    {
       
        string formID = "PostForm";
    
        StringBuilder strForm = new StringBuilder();
        strForm.Append("<form id=\"" + formID + "\" name=\"" + 
                       formID + "\" action=\"" + url + 
                       "\" method=\"POST\">");
    
        foreach (string key in data)
        {
            strForm.Append("<input type=\"hidden\" name=\"" + key + 
                           "\" value=\"" + data[key] + "\">");
        }
    
        strForm.Append("</form>");
    
        StringBuilder strScript = new StringBuilder();
        strScript.Append("<script language=\"'javascript'\">");
        strScript.Append("var v" + formID + " = document." + 
                         formID + ";");
        strScript.Append("v" + formID + ".submit();");
        strScript.Append("</script>");
       
        return strForm.ToString() + strScript.ToString();
    }
     public static void RedirectAndPOST(Page page, string destinationUrl,
                                    NameValueCollection data)
     {
       
         string strForm = PreparePOSTForm(destinationUrl, data);
         
         page.Controls.Add(new LiteralControl(strForm));
     }

    А теперь трудности с вложением.... Спасибо!

  2. Alexandr_Erohin

    Jun 2 Администратор
    Добавлено 4 года назад Alexandr_Erohin

    Т.е. для отправки POST-запроса создается портянка с созданием формы в коде? :)) Неплохой велосипед, для отправки файла в форме нужно использовать атрибут enctype="multipart/form-data". А вообще можно сделать и так:

    using(WebClient client = new WebClient()) {
        client.UploadFile(url, filePath);
    }

    Если нужен универсальный метод для отправки простых GET/POST запросов (судя из темы с Web API), их есть у меня:

    using System;
    using System.IO;
    using System.Net;
    using System.Threading.Tasks;
    
    namespace ProfessorWeb.Forum.Infrastructure
    {
        public class HttpRespReq
        {
            /// <summary>
            /// Асинхронный запрос GET/POST
            /// </summary>
            /// <param name="contentType">Заголовок типа запроса</param>
            /// <param name="method">Тип метода запроса (GET/POST)</param>
            /// <param name="query">Текст запроса</param>
            /// <param name="url">URL сервера, которому нужно отправить запрос</param>
            public static async Task<string> SendQueryAsync(string contentType, string method, string url, string query = "")
            {
                // Сгенерировать запрос
                HttpWebRequest httpWebRequest;
    
                // Отправить запрос
                if (method.Equals("POST", StringComparison.OrdinalIgnoreCase))
                {
                    httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
                    httpWebRequest.Method = method;
                    
                    if (!String.IsNullOrEmpty(query))
                    {
                        httpWebRequest.ContentType = contentType;
                        httpWebRequest.ContentLength = query.Length;
    
                        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
                        {
                            streamWriter.Write(query);
                            streamWriter.Flush();
                            streamWriter.Close();
                        }
                    }
                }
                else httpWebRequest = (HttpWebRequest)WebRequest.Create(url + "?" + query);
    
                // Получить ответ
                var httpResponse = await httpWebRequest.GetResponseAsync();
                httpResponse = (HttpWebResponse)httpResponse;
    
                string result = "false";
    
                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    result = streamReader.ReadToEnd();
                }
    
                return result;
            }
        }
    }
  3. Спасибо!! Класс!!! Обожаю тебя и твой сайт!

или зарегистрируйтесь чтобы ответить