无法向Web API发出发布请求

时间:2019-07-11 09:52:43

标签: c# asp.net-mvc asp.net-web-api2 protocol-buffers

所以我一直在寻找答案,但是我发现什至没有解决的办法。

我试图在Web API上设置Post方法,但是无论我做什么,都会给我内部服务器错误。

我尝试添加[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 :(得分:0)

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();                
            }

答案 1 :(得分:0)

您是否尝试过转换 很长时间归因于类似的模型;

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


public void Post([FromBody] TimeModel time){
      // Do Stuff
}

答案 2 :(得分:0)

这里是创建简单服务器的代码

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
}