Как реализовать POST и загружать файлы в ASP C # с помощью API? - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь реализовать пост HTTP-вызов через ASP C #, используя API, который мне дали.API не сделан мной, но он прекрасно работает в Почтальоне.

Вот скриншот, который отлично работал в Почтальоне:

enter image description here

и

enter image description here

Теперь мне просто нужно преобразовать его в ASP C #, который я потратил несколько дней на Google, но не смог найти нужный мне ответ, или япросто плохо в поиске правильного ключевого слова.Вот то, что я попробовал, но это код компании, который работает на его странице, но не на моей (он ушел).

public static objWebService PostSomething(string xml, Object md)
    {
        objWebService _webService = new objWebService();
        _webService.result = false;
        DataSet ds = new DataSet();

        XmlDocument xdoc = new XmlDocument(); //seems not used
        string responseString = string.Empty;

        string endpoint = "http://xxxxxxxxxxxxx"; // my post api.

        try
        {

            HttpWebRequest wrWebRequest = (HttpWebRequest)WebRequest.Create(endpoint);
            wrWebRequest.Headers["Authorization"] = "Basic xxxxxxxxxxxxx";

            string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
            byte[] boundaryBytes = Encoding.UTF8.GetBytes("--" + boundary + "\r\n");
            byte[] newLine = Encoding.UTF8.GetBytes("\r\n");
            byte[] trailer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");

            byte[] boundaryBytesF = System.Text.Encoding.ASCII.GetBytes("--" + boundary + "\r\n");

            wrWebRequest.ContentType = "multipart/form-data; boundary=" + boundary;
            wrWebRequest.Method = "POST";
            wrWebRequest.KeepAlive = true;

            Stream requestStream = wrWebRequest.GetRequestStream();

            byte[] formItemBytes = System.Text.Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"proposal.xml\"\r\nContent-Type: application/xml;\r\n\r\n{1}", "xml", req));
            requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
            requestStream.Write(formItemBytes, 0, formItemBytes.Length);

            if (Utilities.IsFileExist(md.file1_path))
            {
                requestStream.Write(newLine, 0, newLine.Length);
                int bytesRead = 0;
                byte[] buffer = new byte[2048];
                byte[] formFileBytes = System.Text.Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: image/jpeg;\r\n\r\n", "files", md.file1_name));
                requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
                requestStream.Write(formFileBytes, 0, formFileBytes.Length);

                using (FileStream fileStream = new FileStream(System.Web.Hosting.HostingEnvironment.MapPath(md.file1_path), FileMode.Open, FileAccess.Read))
                {
                    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        requestStream.Write(buffer, 0, bytesRead);
                    }

                    fileStream.Close();
                }
            }

            requestStream.Write(newLine, 0, newLine.Length);
            requestStream.Write(trailer, 0, trailer.Length);
            requestStream.Close();

            HttpWebResponse wrWebResponse = wrWebRequest.GetResponse() as HttpWebResponse;

            using (Stream s = wrWebResponse.GetResponseStream())
            {
                ds.ReadXml(s);
            }

            if (ds.Tables["returnObj"] != null)
            {
                _webService.result = true;
                _webService.output = ds;
            }
            else
            {
                _webService.result = false;
            }
        }
        catch (WebException wExp)
        {
            _webService.result = false;
        }
        catch (Exception exp)
        {
            _webService.result = false;
        }
        return _webService;
    }

Это код для вставки копии, который я взял у своего бывшегомы с коллегами подстригаем везде, где чувствую, что подстричься безопасно.Простите, если все еще грязно.

Всякий раз, когда запускается эта часть кода, я получаю эти исключения.

Exception thrown: 'System.Web.HttpException' in System.Web.dll
Exception thrown: 'System.Web.HttpException' in System.Web.dll
Exception thrown: 'System.ArgumentException' in System.Web.dll

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

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Как стыдно.Проблема заключалась в том, что путь к файлу был в неправильном формате, который даже не доступен в моем предварительном просмотре кода.(~ / Ххх / xx.jpg)

0 голосов
/ 29 мая 2019

Конвертируйте ваш файл в байт [] и затем преобразуйте byte [] в HttpContent

HttpContent bytesContent = new ByteArrayContent(bArr);

А потом передать

using (var formDataImage = new MultipartFormDataContent())
{                                                                                                                        
  formDataImage.Add(bytesContent, "image", "image");
  using (var httpImage = new HttpClient())
  {
     ServicePointManager.Expect100Continue = true;                                                                
     ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;                                                              
     httpImage.DefaultRequestHeaders.Add("Authorization", oAuthHeaderImage);                                                                
     var httpRespImage = httpImage.PostAsync(baseUrlImage, formDataImage);                                                                
     var respBodyImage = httpRespImage.Result;                                                                
     if (respBodyImage.StatusCode.ToString().ToLower() != "created")
     {
         string rspImage = httpRespImage.Exception.InnerException.ToString();                                                                    
     }
  }
}
...