Verwenden eines DelegatingHandlers in der HTTPClient -Klasse von Windows Forms - Inner Handler wurde nicht festgelegtC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Verwenden eines DelegatingHandlers in der HTTPClient -Klasse von Windows Forms - Inner Handler wurde nicht festgelegt

Post by Anonymous »

Zuerst ist die Fehlermeldung, die ich empfange, wie folgt: Der innere Handler wurde nicht eingestellt. Wenn meine Codebasis beispielsweise einen Aufruf an die API tätigt und wiederum einen 401 erhält, sollte sie die Anmelde -URL wiederholen, um ein aktualisiertes Cookie zu erhalten. Ich hatte vor, dies wie folgt zu erreichen: < /p>

Code: Select all

public class CkApiMessageHandler : DelegatingHandler
{
private readonly string _email;
private readonly string _password;
private const string _loginPath = "Account/Login";

public CkApiMessageHandler(string email, string password)
{
_email = email;
_password = password;

//InnerHandler = new HttpControllerDispatcher(null);
}

protected async override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{

var response = await base.SendAsync(request, cancellationToken);

if(response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{
Logging.Logger.LogInformation("Authentication cookie timed out");
var baseAddress = request.RequestUri.Host;
var loginPath = baseAddress + _loginPath;

var originalRequest = request;

var loginRequest = new HttpRequestMessage(new HttpMethod("POST"), loginPath);
var dict = new Dictionary();
dict.Add("Email", _email);
dict.Add("Password", _password);

var form = new FormUrlEncodedContent(dict);
loginRequest.Content = form;
loginRequest.Headers.Clear();

foreach(var header in originalRequest.Headers)
{
loginRequest.Headers.Add(header.Key, header.Value);
}

var loginResponse = await base.SendAsync(loginRequest, cancellationToken);

if (loginResponse.IsSuccessStatusCode)
{
Logging.Logger.LogInformation("Successfully logged back in");
return await base.SendAsync(originalRequest, cancellationToken);
}
else
{
Logging.Logger.LogException(new Exception("Failed to log back in"), "Could not log back in");
}
}

return response;
}

}
< /code>

Ich konvertiere einen alten Dienst, der verwendet wird, mit dem die Datenbank direkt zugegriffen hat, in einen Dienst, der auf eine Web -API zugreift, und ich versuche, dies zu tun, ohne einen der Verbraucher dieser Klasse zu ändern. Daher der seltsame Handler. Hier ist eine Beispielmethode aus der Dienstklasse. < /P>

 public void UpdateClientInstallDatabaseAndServiceData(string dbAcronym, string clientVersion, string clientEnginePort, Guid installationId, string sqlserver)
{
var dict = new Dictionary();
dict.Add("dbAcronym", dbAcronym);
dict.Add("clientVersion", clientVersion);
dict.Add("clientEnginePort", clientEnginePort);
dict.Add("desktopClientId", installationId.ToString());
dict.Add("sqlServerIp", sqlserver);

var form = new FormUrlEncodedContent(dict);

_client.PostAsync(_apiPath + "/UpdateClientInstallDatabaseAndServiceData", form);
}
< /code>

Wenn der obige Code mit einem 401 fehlschlägt, meldet sich der Dienst den ursprünglichen Code automatisch wieder an und wird wiederholt, ohne dass der Verbraucher des Dienstes Anfragen überprüfen und zurückgibt. Der Verbraucher sollte nicht wissen, dass es sich um eine Web -API handelt.    

Mein [url=viewtopic.php?t=15738]Problem[/url] ist, dass mein Nachrichtenhandler erwartet, dass ein Innerhandler 
festgelegt wird, der eine Instanz der httpConfiguration -Klasse erfordert. Wenn ich mir die technischen Daten hier anschaue, scheint es eine Art von Klasse zu sein, die zum Einrichten eines Web -API -Dienstes verwendet wird. Dies ist in Ordnung, außer dass dieser Code nicht in einer API ausgeführt wird. Er wird in einer Windows -Formulations -App ausgeführt. Der Delegierungshandler wird in einer httpclient < /code> -Klasse wie so verwendet ... < /p>

Code: Select all

_client = new HttpClient(new CKEnterprise.Common.CkApiMessageHandler(email, password));
Meine Frage ist also [/b]: Wie kann ich diesen DelegatingHandler dazu bringen, seinen Job außerhalb des Kontextes eines Web -API -Projekts zu erledigen? />https://blogs.msdn.microsoft.com/henrik ... explained/

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post