2016-06-25 17 views
2

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.

+0

Sie sagt, es trifft die Methode, aber es hängt, an welcher Leitung hängt es? –

+0

@MikayilAbdullayev Sorry ja, weiß nicht, wie ich es geschafft habe, zu vergessen. Just update jetzt. – ste2425

+1

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

Antwort

0

Ich weiß nicht, wie Sie AJAX verwenden würden, damit ein Benutzer eine Datei in einem Browser herunterladen kann. Sie können einen Standard-HTML-Link zu einer neuen ASPX-Seite verwenden und Ihren Web-API-Aufrufcode in Page_Load der neuen Seite einfügen, mit der Sie verlinken.

+0

Ich mache hier eine Annahme. Sie möchten, dass der Benutzer die Postleitzahl erhält? Oder nutzt die Webseite die Daten? –

+0

danke für deine antwort. Wenn ich meine Frage erneut lese, klingt das so, als würde ich versuchen, es auf den Client herunterzuladen. Aber ich bin nicht krank, meine Frage zu aktualisieren. Ich habe eine Lösung gefunden, dank der Beiträge aller Beteiligten. Ich werde es bald hinzufügen. – ste2425

0

wahrscheinlich die meisten, dass Deadlock Ursache durch den Kontext ASP.NET Synchronisation zu sein (siehe Details here]. Sie können versuchen, ConfigureAwait(false); auf dem Asynchron-Anruf mit der Asynchron-Fortsetzung zu vermeiden versuchen, den Synchronisationskontext zu erwerben.