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>
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>
Zuerst ist die Fehlermeldung, die ich empfange, wie folgt: [b] 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>
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);
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 [/code] 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]_client = new HttpClient(new CKEnterprise.Common.CkApiMessageHandler(email, password)); [/code]
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/henrikn/2012/08/07/httpclient-httpclientHandler-webrequesthandler-explained/
Visual Studio Community 2022 erlaubt mir nicht, ein neues Windows Forms App (NET) -Projekt zu erstellen. Ich habe nur das .NET -Framework, aber das erlaubt mir nicht, .csproj zu öffnen. Ich weiß...
Anfänger hier in C#.
Ich wollte mit Hilfe von WPF ein Projekt in C# machen. Ich mache das zum ersten Mal. Alle funktionierten gut, abgesehen von diesem OrdnerBrowserDialog und...
Anfänger hier in C#. Ich mache das zum ersten Mal. Alle funktionierten gut, abgesehen von diesem OrdnerBrowserDialog und system.windows.Forms.dialogresult.ok kann nicht verwendet werden, da sie von...
Ich kann anscheinend keine aktuelle, aktualisierte Antwort finden. Die Grundfunktionalität funktioniert bei mir, da eine Liste automatisch wie folgt sortiert wird:
001.15
1
2
3
some
string