C#WebRequest删除GET请求上的Authorization标头

问题描述 投票:0回答:2

我正在尝试与某些服务器通信,但是当我使用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。

c# authorization webrequest
2个回答
0
投票

也许尝试使用WebHeaderCollection.Add(HttpRequestHeader, String)重载方法。

WebHeaderCollection.Add(HttpRequestHeader, String)

0
投票

您可以尝试使用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
© www.soinside.com 2019 - 2024. All rights reserved.