HTTP请求可在邮递员中使用,但不能在C#代码中使用

时间:2019-06-30 08:35:47

标签: c# http request postman flurl

我想用C#进行一个简单的HTTP请求,但是没有任何效果,我得到的只是403 Forbidden状态码。

当我尝试在Postman中执行相同的请求时,一切正常。 我试图运行Fiddler,并查看Postman发送的所有标头。我复制粘贴了所有这些内容,但在C#代码发送的请求中仍然有403 Forbidden

C#代码(使用https://flurl.dev):

public static void Main(string[] args)
{
    FlurlHttp.Configure(settings => {
        settings.HttpClientFactory = new MyClientFactory();
    });

    var url = "https://example.com"
        .AppendPathSegments(new[] { "v1", "oauth", "accesstoken" })
        .SetQueryParam("grant_type", "client_credentials")
        .AllowAnyHttpStatus()
        .WithBasicAuth("username", "password")
        .WithHeaders(new {
            User_Agent = "Something/0.4.0 Dalvik/2.1.0 (Linux; U; Android 5.1.1; SM-G975F Build/NRD90M)",
            X_Secret_Header = "secret_encoded_value",
            accept_encoding = "gzip, deflate",
            Accept = "*/*"
        });

    HttpResponseMessage msg = url.GetAsync().Result;

    Console.WriteLine("StatusCodeString: " + msg.StatusCode.ToString());
    Console.WriteLine();
    Console.WriteLine(msg.Content.ReadAsStringAsync().Result);
}

class MyClientFactory : DefaultHttpClientFactory
{
    public override HttpMessageHandler CreateMessageHandler()
    {
        return new HttpClientHandler
        {
            AllowAutoRedirect = false
        };
    }
}

C#请求和响应:

CSharp Request in Fiddler CSharp Response

邮递员的请求和响应:

Postman Headers Postman Response Postman Response in Fiddler

有人可以解释一下为什么这行不通吗?相同的标题,相同的一切。

我将网址替换为“ example.com”,因为我不想在此处显示真实的API网址。

对于这么多图像也表示歉意。我不知道如何以其他方式显示问题。

5 个答案:

答案 0 :(得分:0)

下一步是比较C#代码和Postman中的Raw请求和响应,并排放置它们并比较它们之间的差异-我向您保证至少会有一个。 :-)

403是一个authorization problem,因此该令牌将是第一个可疑对象,因为您请求的结构不正确,很可能会引发400“错误请求”错误。

不过,在这种情况下,我已经使用Flurl在VS2019的计算机上运行了您的代码,它似乎运行良好。 它返回一个示例HTML页面:

<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 50px;
        background-color: #fff;
        border-radius: 1em;
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        body {
            background-color: #fff;
        }
        div {
            width: auto;
            margin: 0 auto;
            border-radius: 0;
            padding: 1em;
        }
    }
    </style>
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

答案 1 :(得分:0)

我的建议是从邮递员和C#应用程序中检索原始请求字符串,并使用类似https://text-compare.com/的东西来查找差异。猜测有一些极小的差异,例如用斜线很难看到的额外斜线。

答案 2 :(得分:0)

在邮递员的右侧,应该有一个名为代码的链接。单击该,然后选择C#以获取Postman生成的代码。将其粘贴并尝试。

答案 3 :(得分:0)

我知道这很老,但是要获得与邮递员发送的相同的C#代码,让邮递员为其生成代码,但首先必须从nuget或PM控制台获取RestSharp lib,输入以下内容:

安装包RestRequest-版本1.2.0

步骤:

1-从邮递员那里调用您的rest api

2-按下代码按钮 enter image description here 3-将打开一个弹出窗口,然后选择所需的任何语言(在您的情况下为C#) enter image description here

答案 4 :(得分:0)

对我来说,问题是C#中的TLS设置。尝试在应用程序开头或HTTP请求代码之前添加以下行:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;