Не удается отправлять запросы в веб-API - PullRequest
1 голос
/ 11 июля 2019

Так что я искал ответ на этот вопрос, но ничего, что я нашел, даже близко не подходит к его решению.

Я пытаюсь настроить метод Post в моем Web API, но неважното, что я делаю, просто выдает мне внутреннюю ошибку сервера.

Я попытался добавить [FromBody] (это простой тип).

    HttpClient client {get;set;}

    public APICall()
        {
         client = new HttpClient
         {
             BaseAddress = new Uri("http://localhost:1472/api/")
          };

          client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-protobuf"));
        }


    public void PostTimeTaken(long timeTaken)
            {
                var response = client.PostAsJsonAsync("Logging", timeTaken).Result;
                if (!response.IsSuccessStatusCode)
                {
                    Console.WriteLine(response.ReasonPhrase);
                }
            }

, и тогда мое действие контроллера выглядит так:

public void Post([FromBody] long timeTaken)
        {
            _api.DataBuilder.NumberOfAPICalls += 1;
            _api.DataBuilder.ResponseTimes.Add(timeTaken);
        }

Я не получаю сообщения об ошибке, которое могло бы фактически объяснить, что происходит, просто "Внутренняя ошибка сервера"

------ РЕШЕНО -------

На тот случай, если кто-нибудь наткнется на это в поисках того же ответа, проблема заключалась в том, что я отправлял данные на сервер в неправильном формате, сначала нужно было сериализовать ProtoBuf, фрагмент кода для любого, кому это могло бы помочь:

public void PostToAPI(int ThingToSend)
        {
            using (var stream = new MemoryStream())
            {
                // serialize to stream
                Serializer.Serialize(stream, ThingToSend);
                stream.Seek(0, SeekOrigin.Begin);

                // send data via HTTP
                StreamContent streamContent = new StreamContent(stream);
                streamContent.Headers.Add("Content-Type", "application/x-protobuf");
                var response = client.PostAsync("Logging", streamContent);
                Console.WriteLine(response.Result.IsSuccessStatusCode);
            }
        }

Ответы [ 3 ]

0 голосов
/ 11 июля 2019

Вы пытались конвертировать long timeTaken to A like;

public class TimeModel {
     public long TimeTaken {get;set;}
}


public void Post([FromBody] TimeModel time){
      // Do Stuff
}
0 голосов
/ 11 июля 2019

Вот код создания простого сервера

baseUrl = "http://localhost:1472/"; // change based on your domain setting
using (WebApp.Start<StartUp>(url: baseUrl))
{
     HttpClient client = new HttpClient();
     var resp = client.GetAsync(baseUrl).Result;
}

Вот некоторые изменения в вашем коде

var requestData = new List<KeyValuePair<string, string>>   // here 
{
       new KeyValuePair<string, string>( "Logging",timeTaken),
};

       Console.WriteLine("request data : " + requestData);
       FormUrlEncodedContent requestBody = newFormUrlEncodedContent(requestData);                
       var request = await client.PostAsync("here pass another server API", requestBody);
       var response = await request.Content.ReadAsStringAsync();
       Console.WriteLine("link response : " + response); 

Пожалуйста, добавьте ваш контроллер

[HttpPost] // OWIN - Open Web Interface for .NET

public HttpResponseMessage Post([FromBody] long timeTaken)
{
      _api.DataBuilder.NumberOfAPICalls += 1;
      _api.DataBuilder.ResponseTimes.Add(timeTaken);
      return Request.CreateResponse(HttpStatusCode.OK); //Using Post Method
}
0 голосов
/ 11 июля 2019
using (var client = new HttpClient())
            {
                string url = "http://localhost:7936";
                client.BaseAddress = new Uri(url);
                var jsonString = JsonConvert.SerializeObject(contentValue);
                var content = new StringContent(jsonString, Encoding.UTF8, "application/json");
                var result = await client.PostAsync("/Api/Logger/PostActionLog", content);
                string resultContent = await result.Content.ReadAsStringAsync();                
            }
...