Member 13605985 Ответов: 1

Как разместить файл и данные в api с помощью httpclient C#


I am at learning phase and i want to post file and data to api using httpclient. i have tried this. Here is my controller code

когда я передаю параметры в api, значения становятся нулевыми.

Что я уже пробовал:

string baseUrl = ServerConfig.server_path + "/api/Payment/AddMedicineOrder"; Dictionary parameters = new Dictionary();

        parameters.Add("username",user.Username);
        parameters.Add("FullName", FullName);
        parameters.Add("Phone", Phone);
        parameters.Add("CNIC", CNIC);
        parameters.Add("address", address);
        parameters.Add("Email", Email);
        parameters.Add("dateofbirth", dateofbirth.ToShortDateString());
        parameters.Add("Gender", Gender);
        parameters.Add("PaymentMethod", PaymentMethod);
        parameters.Add("Title", Title);
        parameters.Add("PhramaList", medList);



       HttpClient client = new HttpClient();
            client.BaseAddress = new Uri("https://localhost:44391/");
            MultipartFormDataContent form = new MultipartFormDataContent();
            HttpContent content = new StringContent("fileToUpload");
            HttpContent DictionaryItems = new FormUrlEncodedContent(parameters);
            form.Add(content, "fileToUpload");
            form.Add(DictionaryItems, "medicineOrder");
   var stream = PostedPrescription.InputStream;
            content = new StreamContent(stream);
            content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
            {
                Name = "fileToUpload",
                FileName = PostedPrescription.FileName
            };
            form.Add(content);

            var response =await client.PostAsync("/api/Payment/AddMedicineOrder", form);
            var k =response.Content.ReadAsStringAsync().Result;




Вот веб-Api , где передают параметры, то он получил null, а не передают значения в веб-api .

[HttpPost]
            public async Task<API> AddMedicineOrder(string username)
            {
                var request = HttpContext.Current.Request;
                bool SubmittedFile = (request.Files.Count != 0);
                this.Request.Headers.TryGetValues("medicineOrder", out IEnumerable<string> somestring);

                var k = somestring;
  return OK("Success");
            }
            catch (Exception ex)
            {
                return InternalServerError("Technical Error.");
            }


Пожалуйста помогите мне заранее спасибо

1 Ответов

Рейтинг:
2

benjaminemanuel13

Вот код, который я придумал, основываясь на вашем:

static async void GoPost()
        {
            string baseUrl = "http://localhost" + "/api/Payment/AddMedicineOrder";

            Dictionary<string, string> parameters = new Dictionary<string, string>();

            parameters.Add("username", "benemanuel");
            parameters.Add("FullName", "benjamin emanuel");
            parameters.Add("Phone", "0800-0800000");
            parameters.Add("CNIC", "1234");
            parameters.Add("address", "an address");
            parameters.Add("Email", "ben@benemanuel.net");
            parameters.Add("dateofbirth", "14/05/1974");
            parameters.Add("Gender", "Male");
            parameters.Add("PaymentMethod", "Credit Card");
            parameters.Add("Title", "Mr");
            parameters.Add("PhramaList", "123");

            HttpClient client = new HttpClient();
            //client.BaseAddress = new Uri("http://localhost:54169");
            MultipartFormDataContent form = new MultipartFormDataContent();
            HttpContent content = new StringContent("fileToUpload");
            HttpContent DictionaryItems = new FormUrlEncodedContent(parameters);
            form.Add(content, "fileToUpload");
            form.Add(DictionaryItems, "medicineOrder");

            var stream = new FileStream("c:\\TemporyFiles\\test.jpg", FileMode.Open);
            content = new StreamContent(stream);
            content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
            {
                Name = "fileToUpload",
                FileName = "AFile.txt"
            };
            form.Add(content);

            HttpResponseMessage response = null;

            try
            {
                response = (client.PostAsync("http://localhost:54169/api/Values/AddMedicineOrder?username=ben", form)).Result;
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            var k = response.Content.ReadAsStringAsync().Result;
        }


и WebApi:

[Route("api/Values/AddMedicineOrder")]
        [HttpPost]
        public HttpResponseMessage AddMedicineOrder(string username)
        {
            if (!Request.Content.IsMimeMultipartContent("form-data"))
                return Request.CreateResponse(HttpStatusCode.InternalServerError);
            
            var request = HttpContext.Current.Request;
            bool SubmittedFile = (request.Files.Count != 0);

            string vals = request.Form.GetValues("medicineOrder").First();

            NameValueCollection vals2 = HttpUtility.ParseQueryString(vals);

//example values:
            string value1 = vals2.GetValues("username").First();
            string value2 = vals2.GetValues("FullName").First();

            int count = vals2.Count; // 11

            return Request.CreateResponse(HttpStatusCode.OK);
            
            
            //return Request.CreateResponse(HttpStatusCode.InternalServerError);
    }

Это только получает значения словаря, которые вы хотели, я не пытался извлечь файл из потока или что-то еще, я оставлю это на ваше усмотрение :)