我正在尝试与某些服务器通信,但是当我使用GET请求时,授权标头被删除。
我的代码(请原谅):
public ApiResponse MakeApiRequest(string path, string body, Dictionary<string, string> header,
Dictionary<string, string> query, string method)
{
var queryBuilder = new StringBuilder("?");
foreach (var queryPair in query)
{
queryBuilder.Append(queryPair.Key + "=" + queryPair.Value + "&");
}
var queryString = queryBuilder.ToString();
queryString = queryString.Substring(0, queryString.Length - 1);
var request = (HttpWebRequest) WebRequest.Create(new Uri(ApiServer + path + queryString));
request.Timeout = 5000;
request.UserAgent = "VSpedSync/DevBuild";
request.Method = method;
foreach (var headerPair in header)
{
if (headerPair.Key.ToLower().Equals("user-agent")) continue;
if (headerPair.Key.ToLower().Equals("authorization"))
{
request.PreAuthenticate = true;
}
request.Headers.Add(headerPair.Key, headerPair.Value);
}
Debug.WriteLine("preauth "+request.PreAuthenticate);
if (!body.Equals(""))
{
var stream = request.GetRequestStream();
var streamWriter = new StreamWriter(stream);
streamWriter.Write(body);
streamWriter.Close();
}
HttpWebResponse response;
try
{
response = (HttpWebResponse) request.GetResponse();
}
catch (WebException ex)
{
response = (ex.Response as HttpWebResponse);
if (response == null)
throw;
}
foreach (string requestHeader in request.Headers)
{
Debug.WriteLine(" --> "+requestHeader+": "+request.Headers.Get(requestHeader));
}
var statusCode = response.StatusCode;
var responseHeaders = new Dictionary<string, string>();
foreach (string headerKey in response.Headers)
{
var headerVal = response.Headers.Get(headerKey);
responseHeaders.Add(headerKey, headerVal);
}
var responseBody = "NONE";
try
{
var streamReader = new StreamReader(response.GetResponseStream());
responseBody = streamReader.ReadToEnd();
}
catch (Exception)
{
responseBody = "ERROR";
// ignored
}
return new ApiResponse(
statusCode,
responseBody,
!responseBody.Equals("ERROR") && !responseBody.Equals("NONE"),
responseHeaders
);
}
这就是我所说的方法:
var apiResponse = api.MakeApiRequest("auth/check/", "", new Dictionary<string, string>()
{
{"Authorization", "Bearer " + token.token},
{"test", "f"}
}, new Dictionary<string, string>(), "GET");
当我使用GET方法时发送的标头:
--> User-Agent: VSpedSync/DevBuild
--> test: f
--> Host: localhost:55445
我使用POST方法时发送的标头:
--> User-Agent: VSpedSync/DevBuild
--> Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
--> test: f
--> Host: localhost:55445
我做错什么了吗?
Edit:似乎要解决。我现在使用RestSharp而不是普通的WebRequest。
也许尝试使用WebHeaderCollection.Add(HttpRequestHeader, String)
重载方法。
WebHeaderCollection.Add(HttpRequestHeader, String)
您可以尝试使用public static ApiResponse MakeApiRequest(string path, string body, Dictionary<string, string> headers,
Dictionary<string, string> query, string method)
{
// Generate the query string
string queryString = '?' +
string.Join(separator: '&', values: query.Select(q => $"{q.Key}={q.Value}"));
// Create request obejct
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(ApiServer + path + queryString));
request.Timeout = 5000;
request.UserAgent = "VSpedSync/DevBuild";
request.Method = method;
// Set headers to the request
foreach (KeyValuePair<string, string> h in headers)
{
if (h.Key.Equals("Authorization", StringComparison.OrdinalIgnoreCase))
{
request.Headers.Add(HttpRequestHeader.Authorization, h.Value);
}
else if (!h.Key.Equals("UserAgent", StringComparison.OrdinalIgnoreCase))
{
request.Headers.Add(h.Key, h.Value);
}
}
foreach (string requestHeader in request.Headers)
{
Debug.WriteLine(" --> " + requestHeader + ": " + request.Headers.Get(requestHeader));
}
// ...
// .... Continue ....
// ...
return null;
}
代替HttpClient
。我尝试了以下操作,并且授权标头在发送后保留在请求中。
HttpClient
输出
WebRequest