首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用C# HttpClient时收到HTTP 500响应

使用C# HttpClient时收到HTTP 500响应
EN

Stack Overflow用户
提问于 2021-01-29 06:05:49
回答 2查看 44关注 0票数 0

我开发了一个C#应用程序,它调用网络中某台PC上的REST服务。

下面是发出请求的代码:

代码语言:javascript
运行
复制
    public async Task<bool> OpenDoorAsync(string name, int delay)
    {
        var data = await CallApiAsync("api/door/remoteOpenByName", new Dictionary<string, string> { { "doorName", name }, { "interval", delay.ToString() } });
        return data.IsSuccess;
    }

    private async Task<ResponseData> CallApiAsync(string endPoint, Dictionary<string, string> parameters)
    {
        try
        {
            using (HttpClient client = new HttpClient())
            {
                client.Timeout = TimeSpan.FromSeconds(30);
                client.DefaultRequestHeaders.Connection.ParseAdd("keep-alive");

                var content = new StringContent(string.Empty, Encoding.UTF8, "application/json");
                string fullUri = "http://192.168.0.122:8088/api/door/remoteOpenByName?doorName=10.185.85.237-1&interval=5&access_token=1234";
                HttpResponseMessage response = await client.PostAsync(fullUri, content);
                response.EnsureSuccessStatusCode();
                string responseBody = await response.Content.ReadAsStringAsync();
                return JsonConvert.DeserializeObject<ResponseData>(responseBody);
            }
        }
        catch (Exception ex)
        {
            OnError("Existió un error al realizar la llamada.", ex);
            return new ResponseData()
            {
                message = "failed"
            };
        }
    }

入口点是OpenDoorAsync,在Winform表单中以这种方式调用:

代码语言:javascript
运行
复制
await _device.OpenDoorAsync(TxtNombrePuerta.Text.Trim(), IntInterval.Value);

那么,在执行PostAsync方法之后,会返回一个HTTP500错误:

代码语言:javascript
运行
复制
{StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Connection: close
  Date: Thu, 28 Jan 2021 21:06:35 GMT
  Set-Cookie: JSESSIONID=4062B932CDB44B4CA3FCCC275937AC15; Path=/; HttpOnly
  Server: Apache-Coyote/1.1
  Content-Length: 2580
  Content-Language: en
  Content-Type: text/html; charset=utf-8
}}

然而,如果我使用Google Chrome RESTED扩展发出同样的请求,它可以完美地工作:

为了以防万一,我在休息的通话后分析了Google Chrome开发者工具,我没有发现任何奇怪的东西。我想也许我错过了在标题中发送其他东西。

有人知道来自C#应用程序的调用发生了什么吗?很明显,我不是在做休息的事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-29 20:42:19

我真的不知道为什么在使用HttpClient类时它不能工作,然而,我解决了使用RestSharp NuGet包安装的问题。

最后,代码简化为:

代码语言:javascript
运行
复制
    private ResponseData CallApi(string endPoint, Dictionary<string, string> parameters)
    {
        try
        {
            string fullUri = $"http://{GetServerIp()}:{((MainWindow)MainWindow).ServerPort}/{endPoint}?{GetQueryParameters(parameters)}";
            var client = new RestClient(fullUri);
            var request = new RestRequest(Method.POST);
            var response = client.Execute(request);
            return JsonConvert.DeserializeObject<ResponseData>(response.Content);
        }
        catch (Exception ex)
        {
            OnError("Existió un error al realizar la llamada.", ex);
            return new ResponseData()
            {
                message = "failed"
            };
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2021-01-29 06:12:24

您的工作示例是传递cookie,这可能是您所调用的API所必需的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65945912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档