2013-09-04 20 views
13

Mam aplikację internetową obsługującą interfejs API REST WCF dla JSON i usługi sieciowej ASMX. Aplikacja działa już od kilku lat. Jest oparty na ASP.NET 2.0, ale kilka lat temu został uaktualniony do .NET 4.0 i właśnie uaktualniłem .NET 4.5, aby móc korzystać z nowej struktury asynchronicznej.Czy istnieje jakiś sposób obsługi asynchronicznej/oczekującej za usługą ASMX?

Poza aplikacją są niektóre usługi starszego typu, i zdałem sobie sprawę, że istnieje duży potencjał do zwiększenia wydajności dzięki asynchronizacji. Zaimplementowałem asynchronicznie całą aplikację, a wszystko działa idealnie dzięki WCF REST API.

Zbyt późno odkryłem, że API ASMX nie chciałem metody tak:

[WebMethod(Description = "Takes an internal trip ID as parameter.")] 
async public Task<Trip> GetTrip(int tripid) 
{ 
    var t = await Trip.GetTrip(tripid); 
    return t; 
} 

Potem dowiedziałem się, że asynchroniczny/czekają nie jest obsługiwana w ASMX w ogóle, a każdy radzi migrować do WCF . Nie jestem z tego powodu zbyt radosna. ASMX (a właściwie trzy z nich) są wypchane różnymi metodami i jest mnóstwo użytkowników API, których chcemy nadal wyświetlać ze starego interfejsu API.

Ale potrzebujemy zwiększonej wydajności! Czy ktokolwiek wie o obejściu problemu, więc mogę nadal używać async/oczekujących za ASMX, ale eksponować ASMX jak poprzednio?

+1

Czy rozumiesz, że asynchronizacja jest szybsza tylko w szczególnych okolicznościach? Może być wolniej. Najpierw zbadaj to. – usr

+0

możliwy duplikat metod [wywoływania zadań z ASMX] (http://stackoverflow.com/questions/24078621/calling-task-based-methods-from-asmx) – Paddy

Odpowiedz

13

Możliwe, że można to zrobić, ale byłoby to trochę niezręczne. ASMX supports APM-style asynchronous methods i można convert TAP to APM (należy jednak pamiętać, że przykład MSDN na tej stronie nie propaguje wyjątków poprawnie).

Mam przykład na moim blogu, który pokazuje how to wrap TAP implementations in APM (z propagacji wyjątków, który zachowuje prawidłowy typ wyjątku, ale traci stos, zobacz ExceptionDispatchInfo dla poprawnej propagacji wyjątku). Używałem tego przez pewien czas, gdy WCF obsługuje tylko APM. Bardzo podobne podejście powinno działać w przypadku ASMX.

Należy jednak pamiętać, że będzie to have to target 4.5 (i.e., httpRuntime.targetFramework) for async/await to work as expected.

2

Jeśli Twoim problemem jest po prostu integracja z wierzchołkiem logiki asynchronicznej w twoim systemie ASMX, możesz wykonać poniższy fragment.

[WebMethod(Description = "Takes an internal trip ID as parameter.")] 
public Trip GetTrip(int tripid) { 
    var trip = Trip.GetTrip(tripid).Wait(); 
    return trip; 
} 

Należy pamiętać, że jeśli Trip.GetTrip() zgłasza wyjątek, otrzymasz AggregateException, a nie wyjątek byłby otrzymałeś jeśli został czekają rzuca wyjątek. Możesz wykonać następujące czynności:

+9

użycie .Wait() spowoduje blokowanie WebMethod , negując w ogóle jakąkolwiek korzyść z bycia asynchronicznym. –