2013-07-04 16 views
10

Buduję aplikację internetową, która obecnie korzysta z tradycyjnych serwisów internetowych .asmx i chcę uaktualnić je do interfejsu WebAPI. Rozglądałem się po Internecie, ale szukam najłatwiejszego/najszybszego sposobu na to uaktualnienie. Web Services obecnie wyglądać nieco jak poniżej:Aktualizowanie usługi sieci Web z programu ASMX do interfejsu WWW

using System.Web.Services; 

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.Web.Script.Services.ScriptService] 
public class SomeWebServiceName : System.Web.Services.WebService 
{ 
    SomeObject TheObject = new SomeObject; 

    [WebMethod(EnableSession = true)] 
    public string GetSomeData(string Param1, string Param2) 
    { 
     return TheObject.HandleRequest(Param1, Param2); 
    } 

    [WebMethod(EnableSession = true)] 
    public string GetSomeMoreData(string ParamA) 
    { 
     return TheObject.HandleAnotherRequest(ParamA); 
    } 
} 

Na swoim najprostszym poziomie, to instancję obiektu, a następnie metody internetowej wezwanie serwisu WWW jakaś metoda na tym obiekcie do obsługi żądań.

Na kliencie, używam jQuery z .ajax() w taki sposób:

$.ajax({ 
    url: "../WebServices/SomeWebServiceName.asmx/GetSomeData", 
    data: AjaxData, ....}); 

Chcę usunąć wszelkie odniesienia do .asmx i uaktualnić całą aplikację do WebAPI. Jaki jest najprostszy sposób na wykonanie powyższego kodu?

Odpowiedz

8

Jak powiedział @Venkat: "Nie jest łatwo odpowiedzieć bezpośrednio"; Mam na myśli, bez znacznej ilości ręcznego kodowania; jednak wprowadzenie pewnych założeń mogę polecić wdrożyć kontroler jak:

public class SomeWebServiceNameController : ApiController 
{ 
    SomeObject TheObject = new SomeObject(); 

    public string GetSomeData(string Param1, string Param2) 
    { 
     return TheObject.HandleRequest(Param1, Param2); 
    } 

    public string GetSomeMoreData(string ParamA) 
    { 
     return TheObject.HandleAnotherRequest(ParamA); 
    } 

    [HttpPost] 
    public string PostSomeMoreData([FromBody]string ParamA) 
    { 
     return TheObject.HandleAnotherRequest(ParamA); 
    } 
} 

też należy zarejestrować trasach (zwykle w „WebApiConfig.cs”):

public static void Register(HttpConfiguration config) 
{ 
    config.Routes.MapHttpRoute(
     name: "NumberedParametersAPI", 
     routeTemplate: "WebServices/{controller}/{action}/{Param1}/{Param2}" 
    ); 
    config.Routes.MapHttpRoute(
     name: "CharacterizedParametersAPI", 
     routeTemplate: "WebServices/{controller}/{action}/{ParamA}", 
     defaults: new { ParamA = RouteParameter.Optional } 
    ); 
} 

włączyłem ostatnią metodę „PostSomeMoreData” być spójnym z wywołaniem klienta określonym w pytaniu (wywołanie metody ajax jQuery). Należy jednak pamiętać, że prymitywne parametry w metodzie POST interfejsu WebAPI są nieco mylące. Proszę przeczytać te linki:

http://www.intstrings.com/ramivemula/articles/testing-asp-net-web-apiget-post-put-delete-using-fiddler/

http://yassershaikh.com/how-to-call-web-api-method-using-jquery-ajax-in-asp-net-mvc-4/

http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

+0

**/{akcja}/** zastępcze są zbędne w Web API. – Jude

1

Nie jest łatwo odpowiedzieć bezpośrednio. Najpierw musimy zweryfikować twoją architekturę aplikacji, która naprawdę obsługuje połączenia oparte na HTTP/REST. Moja prośba jest taka, zanim przejdziemy do interfejsu Web API, którego cel musi zostać wyjaśniony.

Nie jestem pewien, w najprostszy sposób, ale trudno jest przeprowadzić migrację ręcznie. Jeśli usługi internetowe mają pliki klas za metodami ASMX lub masz abstrakcję do swoich usług, możemy łatwo ponownie wykorzystać abstrakcję do uaktualnienia do Web API.

Proszę sprawdzić poniższy link, można uzyskać lepsze wyobrażenie o Web API: http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-and-WCF-REST-and-Web-Service.html

3

Utwórz klasę niżej, należy umieścić go w folderze Kontrolery/API, dodać następujące WebApiConfig pod App_Start

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{action}/{id}", 
      new { id = RouteParameter.Optional, action = RouteParameter.Optional }); 
    } 
} 

Controller Codee

public class SomeWebServiceNameController : ApiController 
{ 
    SomeObject TheObject = new SomeObject; 

    [HttpGet] 
    public string GetSomeData(string Param1, string Param2) 
    { 
     return TheObject.HandleRequest(Param1, Param2); 
    } 

    [HttpGet] 
    public string GetSomeMoreData(string ParamA) 
    { 
     return TheObject.HandleAnotherRequest(ParamA); 
    } 
} 

Dodaj następujące połączenia w Global.asax.cs pod Application_Start do Regi Ster trasę:

WebApiConfig.Register(GlobalConfiguration.Configuration); 

To bardzo proste wyjaśnienie, i będzie prawdopodobnie chcesz zwrócić obiekt zamiast sznurka, ale to powinno wystarczyć.

Powiązane problemy