W obecnym projekcie nad którym pracuję potrzebuję szybko stworzyć kilka WebSerwisów, które będą rozmawiać z aplikacjami zewnętrznymi poprzez protokół SOAP. Pomyślałem, że skorzystam ze standardowej funkcjonalności dostępnej z poziomu ASP.NET. Niestety na obecną chwilę ASP.NET MVC nie posiada natywnego wsparcia dla tworzenia webserwisów.
O tworzeniu samych webserwisów nie będę się rozpisywał. Aby umożliwić działanie webserwisów poprzez pliki ASMX w aplikacji MVC w sumie nie trzeba nic robić. Dobrze jednak jest powiedzieć silnikowi MVC, aby ignorował żądania dla naszych webserwisów, dzięki czemu ich obsługą zajmie się już bezpośrednio sam IIS. Silnik MVC nie będzie się już do tego dotykał. Wystarczy tylko zdefiniować odpowiednią regułę ignorującą w tabeli routingu:
routes.IgnoreRoute("{webservices}.asmx/{*pathInfo}");
To w sumie już wszystko, ale po uruchomieniu okazało się, że webserwis nie działa. Dostałem wyjątek iż obiekt skojarzony z plikiem ASMX nie może być odnaleziony. Przeniosłem więc klasę definiującą webserwis do zewnętrznego projektu, gdzie trzymam wszystkie swoje pozostałe klasy. W projekcie webowym mam tylko same widoki (ASPX,ASCX), zaś plik ASMX wrzuciłem do katalogu API (tak dla porządku), który utworzyłem w głównym folderze aplikacji webowej. W pliku ASMX jest tylko jedna linia kodu:
<%@ WebService Language="C#" Class="App.WebServices.Test" %>
Powyższa linia oznacza, że ten webserwis definuje obiekt Test w przestrzeni nazw App.Webservices. Wywoływanie takich webserwisów odbywa się tak samo jak w standardowej aplikacji asp.net:
http://localhost/api/test.asmx
Dlaczego przyjąłem takie rozwiązanie? Potrzebowałem czegoś na szybko, dzięki czemu otrzymam możliwość wystawienia API poprzez SOAPa. Nie mam obecnie czasu na szukanie innego rozwiązania. No, chyba, że ktoś ma jakiś błyskotliwy pomysł, w miarę szybki do zaimplementowania, który bardziej przystaje do modelu aplikacji MVC.