11

我正在构建一个当前使用传统 .asmx Web 服务的 Web 应用程序,我希望将它们升级到 WebAPI。我在网上环顾四周,但我正在寻找最简单/最快的方式来进行此升级。Web 服务目前看起来有点像这样:

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

在最简单的层面上,它们实例化一个对象,然后 Web 服务的 Web 方法调用该对象上的某个方法来处理请求。

在客户端,我将 jquery 与 .ajax() 一起使用,如下所示:

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

我想删除对 .asmx 的任何引用并将整个应用程序升级到 WebAPI。使用上面的代码最简单的方法是什么?

4

3 回答 3

12

正如@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 方法调用)保持一致。但请记住,WebAPI 的 POST 方法中的原始参数有点令人困惑。请阅读以下链接:

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/

于 2013-07-09T19:02:53.810 回答
3

下面新建一个类,放在Controllers/Api文件夹下,在App_Start下添加如下WebApiConfig

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

控制器代码

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

在 application_start 下的 global.asax.cs 中添加以下调用以注册路由:

WebApiConfig.Register(GlobalConfiguration.Configuration);

这是一个非常简单的解释,您可能希望返回一个对象而不是字符串,但应该这样做。

于 2013-07-09T18:37:11.037 回答
1

直接回答并不容易。首先,我们需要验证您的应用程序架构是否真正支持基于 HTTP/REST 的调用。我的要求是在我们迁移到 Web API 之前,需要明确目的。

我不确定最简单的方法,但困难的方法是手动迁移。如果您的 Web 服务在 asmx 方法后面有类文件,或者您对服务有抽象,我们可以轻松地重用抽象来升级到 Web API。

请查看以下链接以更好地了解 Web API: http: //www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-and-WCF-REST-和-Web-Service.html

于 2013-07-07T19:09:44.517 回答