RestSharp - заголовок авторизации не попадает в службу WCF REST

Я пытаюсь вызвать локально размещенную службу REST WCF через HTTPS с базовой аутентификацией.

Это работает, и заголовок авторизации проходит нормально, и все в порядке:

ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertficate;
var request = (HttpWebRequest)WebRequest.Create("https://localhost/MyService/MyService.svc/");
request.Method = "GET";
request.ContentType = "application/json";
request.Headers.Add(
  System.Net.HttpRequestHeader.Authorization,
  "Basic " + this.EncodeBasicAuthenticationCredentials("UserA", "123"));

WebResponse webResponse = request.GetResponse();
using (Stream webStream = webResponse.GetResponseStream())
{
    if (webStream != null)
    {
        using (StreamReader responseReader = new StreamReader(webStream))
        {
            string response = responseReader.ReadToEnd();
        }
    }
}

Однако, когда я пытаюсь использовать RestSharp, заголовок авторизации никогда не приходит по запросу:

ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertficate;

var credentials = this.EncodeBasicAuthenticationCredentials("UserA", "123");

var client = new RestSharp.RestClient("https://localhost/MyService/MyService.svc/");   
var restRq = new RestSharp.RestRequest("/");
restRq.Method = Method.GET;
restRq.RootElement = "/";
restRq.AddHeader("Authorization", "Basic " + credentials);
var restRs = client.Execute(restRq);

Что я делаю неправильно с методом RestSharp?

Я знаю, что метод AddHeader работает, потому что это:

restRq.AddHeader("Rum", "And Coke");

пройдет, только «Авторизация» кажется удаленной / отсутствующей.


person Chris Hawkins    schedule 20.07.2013    source источник
comment
здесь то же самое, удачи в решении этого?   -  person RollRoll    schedule 05.10.2014


Ответы (3)


вместо добавления заголовка «вручную» сделайте следующее:

var client = new RestSharp.RestClient("https://localhost/MyService/MyService.svc/");
client.Authenticator = new HttpBasicAuthenticator("UserA", "123");
person wal    schedule 20.07.2013
comment
в порядке. вам нужно использовать fiddler, чтобы увидеть, что именно получено на стороне сервера - person wal; 20.07.2013
comment
я не уверен, что вам нужна косая черта в вашем RestRequest- вы пробовали без этого, то есть просто пустая строка? - person wal; 20.07.2013
comment
Теперь я пытаюсь понять, как использовать Fiddler2 для перехвата трафика с локального хоста... :( - person Chris Hawkins; 20.07.2013
comment
У меня была такая же проблема, и я обнаружил, что проблема заключалась в косой черте (/) в baseUrl конструктора RestClient. Этот не работает: localhost/MyService/MyService.svc. Это успешно: localhost/MyService/MyService.svc. - person Valerio Gentile; 09.10.2016
comment
Была похожая проблема, @ValerioGentile. После определения клиента я создал запрос: var request = new RestRequest(api/2.0/независимо, Method.GET); -- вам нужен завершающий '/' после чего бы то ни было, если у вас есть какие-либо определенные параметры. - person mdegges; 13.01.2018

Я использовал ответ milano, чтобы заставить мой сервисный вызов REST работать (используя GET)

    Dim client2 As RestClient = New RestClient("https://api.clever.com")

    Dim request2 As RestRequest = New RestRequest("me", Method.GET)

    request2.AddParameter("Authorization", "Bearer " & j.access_token, ParameterType.HttpHeader)

    Dim response2 As IRestResponse = client2.Execute(request2)
    Response.Write("** " & response2.StatusCode & "|" & response2.Content & " **")

Ключ заключался в том, чтобы после слова «Bearer» был пробел, но это может относиться к любому типу пользовательского заголовка авторизации токена.

person j.hull    schedule 14.09.2016
comment
@ cs0815 Это был ответ, который мне тоже помог, однако какой бы ни был принятый ответ, по-видимому, помог ОП, так что я думаю, в этом и смысл. - person Metoniem; 13.02.2020

Вы должны использовать параметр ParameterType.HttpHeader:

request.AddParameter("Authorization", "data", ParameterType.HttpHeader);
person milanseitler    schedule 10.05.2014
comment
Я бы сделал это, но как реализацию IAuthenticator, а затем добавил его в экземпляр RestClient. - person Jorge Cabot; 11.01.2017