【问题标题】:Can't make Post requests to Web API无法向 Web API 发出 Post 请求
【发布时间】:2019-07-11 09:52:43
【问题描述】:

所以我四处寻找这个问题的答案,但我发现什么都没有接近解决它。

我正在尝试在我的 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 序列化,代码 sn-p 对任何可能有帮助的人:

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

【问题讨论】:

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


    【解决方案1】:
    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();                
                }
    

    【讨论】:

    • 很遗憾没用,这次没有错误但什么也没发生
    • 好的。你是在发布 json 还是 string ?我可以获得该 api post 方法的示例代码 sn-p 吗?喜欢这个链接Sample Image
    • 我在线程中发布的控制器动作是完整的控制器动作,我正在尝试做的事情的复杂性几乎为 0,但它不起作用,我正在使用 ProtoBuf 并尝试过在发送之前序列化 post 参数,这也不起作用
    【解决方案2】:

    您是否尝试过转换 long 时间采取A类模型;

    public class TimeModel {
         public long TimeTaken {get;set;}
    }
    
    
    public void Post([FromBody] TimeModel time){
          // Do Stuff
    }
    

    【讨论】:

    • 是的,这也只是给了我一个内部服务器错误
    • 您的请求是否到达您的 API?你在调试中看到了吗?
    • 没有出现在调试中,但必须命中 API,因为它是内部错误而不是“未找到”
    【解决方案3】:

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

    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
    }
    

    【讨论】:

    • 仍然是“内部服务器错误”
    • 这个链接对你的问题很有帮助c-sharpcorner.com/UploadFile/ff2f08/…
    • 我想通了,在发送之前我没有对其进行序列化,并且 API 期望的是 protobuf 响应而不是 JSON
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2021-10-25
    相关资源
    最近更新 更多