2013-07-04 18 views
10

Sto costruendo un'app Web che attualmente utilizza i servizi Web .asmx tradizionali e sto cercando di aggiornarli a WebAPI. Mi sono guardato intorno nel web ma sto cercando il modo più semplice/veloce per fare questo aggiornamento. I servizi web al momento sembrano un po 'come questo:Aggiornamento di un servizio Web da asmx a webAPI

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); 
    } 
} 

Al loro livello più semplice, che un'istanza di un oggetto e poi i metodi web del servizio Web chiamata qualche metodo su quell'oggetto per gestire le richieste.

Sul client, ho utilizzare jQuery con Ajax() in questo modo:

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

Voglio rimuovere ogni riferimento a .asmx e aggiornare l'intera applicazione per WebAPI. Qual è il modo più semplice per farlo con il codice sopra?

risposta

8

Come @Venkat ha dichiarato: "Non è facile rispondere direttamente"; Voglio dire, senza una notevole quantità di codice manuale; ma facendo alcune ipotesi posso raccomandare per implementare un controller simile:

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); 
    } 
} 

È inoltre necessario registrarsi percorsi (di solito in "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 } 
    ); 
} 

ho inserito l'ultimo metodo "PostSomeMoreData" per essere coerente con la chiamata del cliente che hai specificato nella tua domanda (chiamata metodo jQuery ajax). Ma tieni presente che i parametri primitivi nel metodo POST di WebAPI sono un po 'confusi. Si prega di leggere questi link:

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

**/{action}/** segnaposto sono ridondanti in API Web. – Jude

1

Non è facile rispondere direttamente. Prima di tutto è necessario convalidare l'architettura dell'applicazione per supportare realmente le chiamate basate su HTTP/REST. La mia richiesta è prima di migrare all'API Web che deve essere eliminata.

Non sono sicuro del modo più semplice, ma il modo più difficile è migrare manualmente. Se i servizi Web dispongono di file di classe con metodi asmx o se si dispone di astrazione per i servizi, è possibile riutilizzare facilmente l'astrazione per l'aggiornamento all'API Web.

Si prega di verificare sul link qui sotto è possibile ottenere una migliore idea circa API Web: http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-and-WCF-REST-and-Web-Service.html

3

Crea una classe inferiore, posizionarlo sotto la cartella Controller/Api, aggiungere il seguente WebApiConfig sotto 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); 
    } 
} 

Aggiungere la seguente chiamata in global.asax.cs sotto Application_Start a Regi ster il percorso:

WebApiConfig.Register(GlobalConfiguration.Configuration); 

Questa è una spiegazione molto semplice, e, probabilmente, si vuole restituire un oggetto invece di stringa, ma che dovrebbe farlo.

Problemi correlati