HTTP-запрос работает в Postman, но не в коде C #

Я хочу выполнить простой HTTP-запрос на C #, но что-то не работает, и все, что у меня есть, - это код состояния 403 Forbidden.

Когда я пытаюсь выполнить тот же запрос в Postman, все работает нормально. Я попытался запустить Fiddler и просмотреть все заголовки, которые отправляет почтальон. Я скопировал их все, но я все еще получил 403 Forbidden в запросе, отправленном кодом C #.

Код 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 в Fiddler Ответ CSharp

Запрос и ответ почтальона:

Заголовки почтальонаОтвет почтальона Ответ почтальона в Fiddler

Может кто-нибудь объяснить мне, почему это не работает? Заголовки одинаковые, все одинаково.

Я заменил URL на example.com, потому что не хочу показывать здесь реальный URL API.

Также извините за так много изображений ... Я не знаю, как показать проблему здесь по-другому.


person Hartes    schedule 30.06.2019    source источник
comment
Не размещайте изображения текста.   -  person RalfFriedl    schedule 30.06.2019
comment
Вы пробовали использовать C # HttpClient? Дает ли это такой же результат?   -  person Tobias Tengler    schedule 30.06.2019
comment
Есть ли шанс, что 403 поступает с прокси-сервера?   -  person John Wu    schedule 30.06.2019
comment
@TobiasTengler Да, я пробовал использовать HttpClient, и результат был тот же.   -  person Hartes    schedule 30.06.2019
comment
@JohnWu Когда я запускаю запрос с помощью Fiddler, и Postman, и C # возвращают 403. Но без Fiddler Postman работает, а C # - нет.   -  person Hartes    schedule 30.06.2019


Ответы (5)


От почтальона справа должна быть ссылка под названием код. Щелкните по нему, а затем выберите C #, чтобы получить код, сгенерированный Postman. Вставьте это и попробуйте.

person Brian Olson    schedule 30.06.2019

Я знаю это старое, но чтобы получить тот же код C #, что и отправленный почтальоном, позвольте почтальону сгенерировать код, но сначала вы должны получить RestSharp lib из nuget или из консоли PM, введите это:

Установочный пакет RestRequest -Version 1.2.0

Шаги:

1- Назовите ваш отдых api от почтальона

2- Нажмите кнопку кода  введите описание изображения здесь 3-Откроется всплывающее окно, затем выберите любой язык, который вы хотите, в вашем случае это C #  введите описание изображения здесь

person Mostafa Hassan    schedule 03.04.2020

Для меня проблема заключалась в настройках TLS в C #. Попробуйте добавить эту строку в начале вашего приложения или непосредственно перед кодом HTTP-запроса:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
person Ocean Airdrop    schedule 17.11.2020
comment
Боже мой, это сработало для меня, спасибо !! но почему изменение его на этот конкретный протокол работает? - person user1294510; 26.06.2021

Следующим шагом будет сравнение необработанных запросов и ответов из вашего кода C # и Postman, разместить их рядом и сравнить различия - уверяю вас, что будет хотя бы один. :-)

403 - это проблема с авторизацией, поэтому токен будет первым подозреваемым, поскольку более вероятна неправильная структура вашего запроса. чтобы выдать 400 ошибку "Плохой запрос".

Однако в этом конкретном случае я запустил ваш код в VS2019 на своей машине с помощью Flurl, и, похоже, он работает нормально. Он возвращает пример 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>
person Duck Ling    schedule 30.06.2019
comment
я заменил фактический URL на example.com, потому что я не хочу показывать здесь настоящий API - person Hartes; 30.06.2019
comment
Итак, ваш код работает. Теперь перейдите на вкладку «Авторизация почтальона» в рабочем примере и проверьте, совпадает ли токен, который вы используете, с тем, который есть в вашем VS-коде. - person Duck Ling; 04.08.2019

Я предлагаю получить необработанные строки запроса от почтальона и приложения C # и использовать что-то вроде https://text-compare.com/, чтобы найти отличия. Предполагается, что есть какая-то крайне незначительная разница, например, лишняя косая черта, которую очень трудно заметить обычным глазом.

person ErBu    schedule 30.06.2019
comment
Я сравнил строки запроса, используя предоставленный вами сайт, но результат говорит: два текста идентичны - person Hartes; 30.06.2019