С# webapi POST через консольную программу

У меня есть веб-API, к которому я могу успешно получить доступ через браузер: -

https://127.0.0.1:8443/ncrApi

Я пытаюсь создать простую консольную программу на С#, используя VS2015, для отправки данных и получения ответа с помощью http POST.

Вот что у меня есть до сих пор: -

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace WebSample
{

    class ApiSendData
    {
        public string UserID { get; set;}  // username 
        public string Password { get; set;}  // password for the webapi

        public string ApiFunction { get; set; }
        public string DppName { get; set; }
        public string ClearData { get; set; }
        public string DppVersion { get; set; }
    }



    class Program
    {
        static void Main(string[] args)
        {
            // The Main function calls an async method named RunAsync 
            // and then blocks until RunAsyncc completes.
            RunAsync().Wait();
        }

        static async Task RunAsync()
        {
            using (var client = new HttpClient())
            {

                //specify to use TLS 1.2 as default connection
                System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

                // This code sets the base URI for HTTP requests, 
                // and sets the Accept header to "application/json", 
                // which tells the server to send data in JSON format.
                client.BaseAddress = new Uri("https://localhost:8443/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));


                // HTTP POST
                var datatobeSent = new ApiSendData()
                                    {
                                        UserID = "xxxx",
                                        Password = "yyyy",
                                        ApiFunction ="NcrSecureData",
                                        DppName ="CSampleCustomer",
                                        DppVersion ="Latest",
                                        ClearData ="1234567890",
                                        ResultType = "JSON"
                                    };

                HttpResponseMessage response = await client.PostAsJsonAsync("ncrApi", datatobeSent);

                if (response.IsSuccessStatusCode)
                {
                    // Get the URI of the created resource.
                    Uri ncrUrl = response.Headers.Location;

                    // do whatever you need to do here with the returned data //


                }
            }
        }
    }
}

В моей переменной ответа я получаю сообщение 200 OK http 1.1 с типом содержимого = application/json и длиной содержимого = 174... но фактические данные не получены...

переменная ncrUrl также равна нулю....

Мне интересно, нужны ли мне дополнительные операторы в моей консольной программе для получения данных?

Вот что я следил: - http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client


person Philo    schedule 25.07.2016    source источник
comment
Что это дает? string payload = await response.Content.ReadAsStringAsync();   -  person Crowcoder    schedule 26.07.2016
comment
{StatusCode: 200, ReasonPhrase: «ОК», версия: 1.1, содержимое: System.Net.Http.StreamContent, заголовки: { X-Frame-Options: запретить X-XSS-защиту: 1; mode=block X-Content-Type-Options: nosniff Connection: close Accept-Ranges: bytes Date: Mon, 25 Jul 2016 21:39:00 GMT ETag: 579686f4.174 Content-Length: 174 Content-Disposition: вложение; filename=results.json Content-Type: application/json Last-Modified: Mon, 25 Jul 2016 21:39:00 GMT }}   -  person Philo    schedule 26.07.2016
comment
Я чувствую, что после этого должны быть получены фактические данные из API.   -  person Philo    schedule 26.07.2016
comment
Это похоже на JSON, поэтому я думаю, что это работает, но ваша операция ncrApi, вероятно, не делает то, что вы думаете.   -  person Crowcoder    schedule 26.07.2016
comment
Но когда я обращаюсь к нему из браузера... и предоставляю ему те же данные, он дает мне выходной загружаемый файл. и этот файл также имеет правильное содержимое.   -  person Philo    schedule 26.07.2016
comment
Мне кажется, я получаю только первую часть сообщения 200OK... и что есть вторая часть сообщения, которая содержит выходные данные... но не знаю, как получить к ней доступ.   -  person Philo    schedule 26.07.2016


Ответы (1)


После прочтения комментариев кажется, что ваш API настроен на возврат файла вместо строкового содержимого, такого как JSON или XML. Вы можете использовать Метод HttpContent.ReadAsStreamAsync для чтения потока ответов и сохранения его в файл.

HttpResponseMessage response = await client.PostAsJsonAsync("ncrApi", datatobeSent);

using (Stream output = File.OpenWrite("filename.txt")) // change
{
    using (Stream input = await response.Content.ReadAsStreamAsync())
    {
        input.CopyTo(output);
    }
}
person jegtugado    schedule 25.07.2016
comment
Определение для GetResponseStream() не содержится в HttpResponseMessage... - person Philo; 26.07.2016
comment
@Philo, да, извините за то, что прошло слишком много времени с тех пор, как я в последний раз использовал HttpResponseMessage. Смотрите мой обновленный ответ. Вместо этого используйте ReadAsStreamAsync(). - person jegtugado; 27.07.2016