Zuerst denke ich, ich muss im C# Novize zu deklarieren. Ich bin ein JS und CSS Entwickler mit einem guten bisschen C, also ist das relativ neues Territorium.HttpClient .Result hängt, wenn [WebMethod] -Attribut verwendet
Also, was ich habe ist eine ASP.NET-Seite, wo ich eine AJAX-Anfrage an den Code hinter, das ist dann eine Anfrage an einen WebAPI-Dienst, um eine Zip-Datei zum Code-Behind, der Client herunterladen muss die zip nicht erhalten.
Wenn ich den Code unten in die Page_Load
stecke alles funktioniert gut und ich bekomme ein Byte-Array der Zip-Datei. Wenn es jedoch in der Methode mit dem Attribut [webmethod]
verwendet wird, trifft es den webAPI-Dienst, bleibt jedoch hängen. Wenn der Dienst zurückkehrt, passiert nichts.
Es blockiert auf Linie var res = client.GetAsync("/someURl").Result
.
Ich habe die Kontrolle über die WebAPI aber wie es gut geht und alles funktioniert gut, wenn das Attribut nicht verwendet wird, glaube ich nicht, dass das Problem an diesem Ende ist. Jedoch kann ich verwandten Code von dort auch bei Bedarf veröffentlichen.
Also habe ich zwei Fragen, erstens was auf der Erde könnte dieses Verhalten verursachen?
Zweitens habe ich einen guten Griff auf Garbage Collection ist JS bei der Arbeit mit Verschlüssen usw., aber nicht hier. Ich habe widersprüchlichen Rat gehört, dass ich das Schlüsselwort using
auf dem Objekt HttpClient
verwenden sollte und sollte. Ich verwende kein einziges Client-Objekt, sondern jedes Mal ein neues, wenn die Ajax-Methode getroffen wird. Also, using
ist hier richtig, nicht wahr?
EDIT: Der Delegate-Handler fügt der Anfrage einige Header hinzu, um mit der Authentifizierung fertig zu werden.
[WebMethod]
public static bool SyncApplicant(int id)
{
var serviceOne = DIFactory.Resolve<IServiceOne>();
var settings= serviceOne .GetCompanySettings();
try
{
var delegatingHandler = new WebApiDelegatingHandler((Guid)settings.AppId, settings.ApiKey);
using (var client = HttpClientFactory.Create(delegatingHandler))
{
client.BaseAddress = new Uri(settings.ApiUrl);
using (var res = client.GetAsync("/someURl").Result)
{
var d = res.Content.ReadAsByteArrayAsync().Result;
}
}
}
catch (Exception ex)
{
var x = ex;
return false;
}
return true;
}
Danke für jeden Hinweis.
Sie sagt, es trifft die Methode, aber es hängt, an welcher Leitung hängt es? –
@MikayilAbdullayev Sorry ja, weiß nicht, wie ich es geschafft habe, zu vergessen. Just update jetzt. – ste2425
Aufruf 'Task.Result' kann Deadlocks verursachen, wenn synchron und asynchrone Methoden sind gemischt Wenn Sie async gehen, müssen Sie async den ganzen Weg gehen. – Nkosi