Erstens: Ich würde keine HttpClient
direkt. Es ist zu einfach, Fehler zu machen - besonders im Bereich der Kopfzeilen. Die DefaultHeadersCollection
ist nicht unveränderlich und nicht thread-sicher, da andere Teile der Anwendung die Header ändern können. Am besten legen Sie die Header fest, wenn Sie den Aufruf tätigen. Wenn Sie mit einer Abstraktion arbeiten, und das wird empfohlen, weil die Klassen in diesem Bereich ein ziemliches Durcheinander sind, würden Sie eine Header-Sammlung haben wollen und diese auf Ihre HttpRequestMessage
bevor Sie sie abschicken. Sie müssen sicherstellen, dass Sie die Kopfzeilen des Inhalts auf den Inhalt und nicht auf die Nachricht setzen.
Code-Referenz
foreach (var headerName in request.Headers.Names)
{
//"Content-Type"
if (string.Compare(headerName, HeadersExtensions.ContentTypeHeaderName, StringComparison.OrdinalIgnoreCase) == 0)
{
//Note: not sure why this is necessary...
//The HttpClient class seems to differentiate between content headers and request message headers, but this distinction doesn't exist in the real world...
//TODO: Other Content headers
httpContent?.Headers.Add(HeadersExtensions.ContentTypeHeaderName, request.Headers[headerName]);
}
else
{
httpRequestMessage.Headers.Add(headerName, request.Headers[headerName]);
}
}
Hier ist eine Datenstruktur, die Sie zum Senden der Anfrage mit den Kopfzeilen verwenden können.
Code-Referenz
public interface IRequest
{
CancellationToken CancellationToken { get; }
string? CustomHttpRequestMethod { get; }
IHeadersCollection Headers { get; }
HttpRequestMethod HttpRequestMethod { get; }
AbsoluteUrl Uri { get; }
}
public interface IRequest<TBody> : IRequest
{
TBody? BodyData { get; }
}
Und eine Sammlung von Kopfzeilen:
Code-Referenz
public sealed class HeadersCollection : IHeadersCollection
{
#region Fields
private readonly IDictionary<string, IEnumerable<string>> dictionary;
#endregion
#region Public Constructors
public HeadersCollection(IDictionary<string, IEnumerable<string>> dictionary) => this.dictionary = dictionary;
public HeadersCollection(string key, string value) : this(ImmutableDictionary.CreateRange(
new List<KeyValuePair<string, IEnumerable<string>>>
{
new(key, ImmutableList.Create(value))
}
))
{
}
#endregion Public Constructors
#region Public Properties
public static HeadersCollection Empty { get; } = new HeadersCollection(ImmutableDictionary.Create<string, IEnumerable<string>>());
public IEnumerable<string> Names => dictionary.Keys;
IEnumerable<string> IHeadersCollection.this[string name] => dictionary[name];
#endregion Public Properties
#region Public Methods
public bool Contains(string name) => dictionary.ContainsKey(name);
public IEnumerator<KeyValuePair<string, IEnumerable<string>>> GetEnumerator() => dictionary.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => dictionary.GetEnumerator();
public override string ToString() => string.Join("\r\n", dictionary.Select(kvp => $"{kvp.Key}: {string.Join(", ", kvp.Value)}\r\n"));
#endregion
}
Siehe den gesamten Arbeitscode und die Beispiele aquí .