RestSharp - 授权标头未涉及 WCF REST 服务
Posted
技术标签:
【中文标题】RestSharp - 授权标头未涉及 WCF REST 服务【英文标题】:RestSharp - Authorization Header not coming across to WCF REST service 【发布时间】:2013-07-19 17:01:15 【问题描述】:我正在尝试使用基本身份验证通过 HTTPS 调用本地托管的 WCF REST 服务。
这行得通,授权标头通过就好了,一切都很开心:
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 时,Authorization 标头永远不会出现在请求中:
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");
将通过,只有“授权”似乎被剥离/丢失。
【问题讨论】:
这里有同样的情况,有没有运气解决这个问题? 【参考方案1】:不要“手动”添加标题,而是执行以下操作:
var client = new RestSharp.RestClient("https://localhost/MyService/MyService.svc/");
client.Authenticator = new HttpBasicAuthenticator("UserA", "123");
【讨论】:
好的。您需要使用 fiddler 来查看服务器端到底收到了什么 我不确定您的RestRequest
中是否需要那个正斜杠-您是否尝试过不使用它,即只是空字符串?
现在我正在尝试弄清楚如何使用 Fiddler2 来捕获本地主机流量... :(
fiddler2.com/documentation/Observe-Traffic/Troubleshooting/…
我遇到了同样的问题,我发现问题是 RestClient 构造函数的 baseUrl 中的斜杠 (/)。这个失败:“localhost/MyService/MyService.svc”。这个成功了:“localhost/MyService/MyService.svc”。【参考方案2】:
我使用 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”一词之后有一个空格,但这可能适用于任何类型的自定义令牌授权标头
【讨论】:
@cs0815 这也是对我有帮助的答案,但是无论接受的答案显然对 OP 有帮助,所以我想这就是重点。【参考方案3】:你必须使用ParameterType.HttpHeader参数:
request.AddParameter("Authorization", "data", ParameterType.HttpHeader);
【讨论】:
我会这样做,但作为IAuthenticator
的实现,然后将其添加到RestClient
实例。以上是关于RestSharp - 授权标头未涉及 WCF REST 服务的主要内容,如果未能解决你的问题,请参考以下文章
WCF 作为 Windows 服务托管 - 自定义 HTTP 标头未反映在响应标头上