首页 > 解决方案 > 从网站到外部 Web api 的简单 POST 失败

问题描述

我有一个 asp .net MVC 页面

我正在尝试连接到Eventbrite:s api

简而言之,它要求您将客户端 ID 发送到一个 url,使用 HttpGET 和 HttpPOST 将结果和更多信息发送到另一个 url。

GET 很好,我得到了所需的(auth)“代码”。当我尝试对第二个网址进行 POST 时,我得到

“套接字异常:现有连接被远程主机强行关闭”

我可以使用Postman和 GET 请求中的信息发布到第二个 url,它工作正常,我得到了 auth 令牌就好了。

这是我使用的代码

    var parameters = new Dictionary<string,string>();
    parameters.Add("code", pCode);
    parameters.Add("client_secret", CLIENT_SECRET);
    parameters.Add("client_id", CLIENT_APP_KEY);
    parameters.Add("grant_type", "authorization_code");

    using (var client = new HttpClient())
    {
        var req = new HttpRequestMessage(HttpMethod.Post, pUrl) { Content = new FormUrlEncodedContent(parameters) };
        var response = client.SendAsync(req).Result;
        return response.Content.ReadAsStringAsync().Result;
    }

在发布到 Azure 时,我对类似问题的记忆模糊。由于我必须使用公共返回 url 注册我的应用程序,因此我无法使用 fiddler 查看请求。

我的网站正在运行 https。我还测试了添加以下行(来自一些谷歌搜索)

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

但后来我得到404错误......

我也对此进行了测试(结果相同)

    using (var client = new HttpClient())
        {
            var response = client.PostAsync(pUrl, content).Result;                
            authToken = response.Content.ReadAsStringAsync().Result;
        }

我已经测试过获取身份验证代码并从本地计算机运行 POST,结果相同......

我已经联系了 eventbrite 开发人员支持,看看他们是否也可以帮助我......

标签: asp.net-mvcazure

解决方案


此 POST 必须包含以下 urlencoded 数据以及 Content-type:application/x-www-form-urlencoded标头。

由于您的内容类型是application/x-www-form-urlencoded您需要对 POST 正文进行编码,特别是如果它包含&在表单中具有特殊含义的字符。然后使用以下函数发布您的数据:

using (var httpClient = new HttpClient())
    {
        using (var content = new FormUrlEncodedContent(parameters))
        {
            content.Headers.Clear();
            content.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

            HttpResponseMessage response = await httpClient.PostAsync(url, content);

            return await response.Content.ReadAsAsync<TResult>();
        }
    }

您提供的错误消息表示远程端关闭了连接,原因是:

·您正在向应用程序发送格式错误的数据。

·客户端和服务器之间的网络连接由于某种原因断开了。

·您在第三方应用程序中触发了导致其崩溃的错误。

·第三方应用程序已耗尽系统资源。

·放ServicePointManager.SecurityProtocol = ServicePointManager.SecurityProtocol | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

更多细节可以参考这个案例


推荐阅读