2013-07-04 40 views
10

Tôi đang xây dựng một ứng dụng web hiện đang sử dụng các dịch vụ web .asmx truyền thống và tôi đang tìm cách nâng cấp các dịch vụ này lên WebAPI. Tôi đã xem xét trên web nhưng tôi đang tìm cách dễ nhất/nhanh nhất để thực hiện nâng cấp này. Các dịch vụ web hiện trông hơi như thế này:Nâng cấp dịch vụ web từ asmx lên 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); 
    } 
} 

Ở mức đơn giản nhất, họ nhanh chóng một đối tượng và sau đó là phương pháp web của cuộc gọi dịch vụ web một số phương pháp trên đối tượng đó để xử lý các yêu cầu.

Trên client, tôi sử dụng jquery với .ajax() như thế này:

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

Tôi muốn loại bỏ bất kỳ tham chiếu đến .asmx và nâng cấp toàn bộ ứng dụng để WebAPI. Cách đơn giản nhất để làm điều đó với mã ở trên là gì?

Trả lời

8

Như @Venkat đã nói: "Không dễ trả lời trực tiếp"; Ý tôi là, không có số lượng mã thủ công đáng kể; nhưng làm cho một số giả định tôi có thể khuyên bạn nên thực hiện một bộ điều khiển như:

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

Bạn cũng nên đăng ký các tuyến đường (thường là trong "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 } 
    ); 
} 

tôi bao gồm các phương pháp cuối cùng "PostSomeMoreData" nhất quán với cuộc gọi của khách hàng mà bạn đã chỉ định trong câu hỏi của bạn (gọi phương thức jQuery ajax). Nhưng hãy nhớ rằng các tham số nguyên thủy trong phương thức POST của WebAPI có đôi chút khó hiểu. Xin vui lòng đọc những liên kết này:

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}/** placeholders là dư thừa trong Web API. – Jude

1

Không dễ trả lời trực tiếp. Trước hết, hãy xác thực kiến ​​trúc ứng dụng của bạn sẽ thực sự hỗ trợ các cuộc gọi dựa trên HTTP/REST. Yêu cầu của tôi là trước khi chúng tôi chuyển sang Web API mục đích cần phải rõ ràng.

Tôi không chắc chắn cách dễ nhất, nhưng cách khó khăn là di chuyển thủ công. Nếu các dịch vụ web của bạn có các tệp lớp đằng sau các phương thức asmx hoặc bạn trừu tượng hóa các dịch vụ của mình, chúng ta có thể dễ dàng tái sử dụng sự trừu tượng để nâng cấp lên Web API.

Vui lòng kiểm tra liên kết bên dưới, bạn có thể nhận được một ý tưởng tốt hơn về Web API: http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-and-WCF-REST-and-Web-Service.html

3

Tạo một lớp bên dưới, đặt nó trong thư mục Controller/Api, thêm dòng sau WebApiConfig dưới 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 }); 
    } 
} 

Bộ điều khiển 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); 
    } 
} 

Thêm cuộc gọi sau vào global.asax.cs trong application_start to regi ster the route:

WebApiConfig.Register(GlobalConfiguration.Configuration); 

Đây là một lời giải thích rất đơn giản và bạn có thể muốn trả về một đối tượng thay vì chuỗi, nhưng điều đó nên làm.

Các vấn đề liên quan