Обновление веб-сервиса от asmx до webAPI

Я создаю веб-приложение, которое в настоящее время использует традиционные веб-службы .asmx, и я хочу обновить их до 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);
    }
}

На самом простом уровне они создают экземпляр объекта, а затем веб-методы веб-службы вызывают некоторый метод для этого объекта для обработки запросов.

На клиенте я использую jquery с .ajax() следующим образом:

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

Я хочу удалить любую ссылку на .asmx и обновить все приложение до WebAPI. Какой самый простой способ сделать это с помощью кода выше?

Ответ 1

Как сказал @Venkat: "Нелегко ответить напрямую"; Я имею в виду, без значительного количества ручного кодирования; но делая некоторые предположения, я могу рекомендовать реализовать контроллер, например:

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

Вы также должны регистрировать маршруты (обычно в "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 }
    );
}

Я включил последний метод "PostSomeMoreData" в соответствие с запросом клиента, указанным в вашем вопросе (вызов метода jQuery ajax). Но имейте в виду, что примитивные параметры в методе POST для WebAPI немного запутывают. Прочтите эти ссылки:

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/

Ответ 2

Создайте класс ниже, поместите его в папку Controllers/Api, добавьте следующий WebApiConfig в 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 });
    }
}

Контроллер 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);
    }
}

Добавьте следующий вызов в global.asax.cs в application_start, чтобы зарегистрировать маршрут:

WebApiConfig.Register(GlobalConfiguration.Configuration);

Это очень простое объяснение, и вы, вероятно, захотите вернуть объект вместо строки, но это должно сделать это.

Ответ 3

Не легко ответить напрямую. Пусть сначала нужно проверить свою архитектуру приложения, которая действительно будет поддерживать вызовы на основе HTTP/REST. Мой запрос перед тем, как мы перейдем к веб-API, нужно очистить цель.

Я не уверен, что это самый простой способ, но трудным путем является миграция вручную. Если у веб-служб есть файлы классов за методами asmx или у вас есть абстракция для ваших сервисов, мы можем легко повторно использовать абстракцию для обновления до веб-API.

Пожалуйста, проверьте приведенную ниже ссылку, чтобы получить лучшее представление о веб-API: http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-and-WCF-REST-and-Web-Service.html