【问题标题】:Web API equivalent to Web Service [.asmx]Web API 等效于 Web 服务 [.asmx]
【发布时间】:2017-04-06 07:35:27
【问题描述】:

我是 Web API 的新手。我已经使用已弃用的 WebServices 实现了一些 Web 服务方法 [.asmx] - 带有属性 [WebMethod],并且能够将我所有不同的方法放在 .asmx 文件中,并且能够在我的 ajax 调用中通过 webmethod 名称调用它们。

我正在尝试将其移至 WebAPI,但我看不出我可以在 WebAPI 中使用不同的方法。

例如,在我的 WebService.asmx 文件中,我可以声明:

 [WebMethod]
    public void LoadReport()
    {
        ...
    }


 [WebMethod]
    public void LoadReport2()
    {
      ...
    }

但在 WebAPI 中,我只能使用 Get()、Put()、Post() 和 Delete()。

如何在 Web API 中声明这两种不同的方法?

【问题讨论】:

标签: c# asp.net-web-api asp.net-web-api2


【解决方案1】:

在web api中使用属性路由。

例如:

[RoutePrefix("api/Data")]
    public class DataController : ApiController
    {
      [Route("LoadReport")]
        [HttpGet]
        public HttpResponseMessage LoadReport()
            {
                ...
            }

        [Route("LoadReport2")]
        [HttpGet]
        public HttpResponseMessage LoadReport2()
            {
                ...
            }

您可以通过调用来访问这些方法

http://localhost:<port>/api/sample/LoadReport
http://localhost:<port>/api/sample/LoadReport2

如果您使用 .Net 4.5.2,请确保启用属性路由。 在 App_Start\WebAPiConfig.cs 文件的Register 方法下添加以下行:

public static void Register(HttpConfiguration config)
{    
         config.MapHttpAttributeRoutes(); //enable Attribute routing  

【讨论】:

  • 我按照您的示例进行操作,但收到错误消息 - {"Message":"No HTTP resource was found that match the request URI 'localhost:5172/api/Data/… action was found on the controller 'Data' that match请求。"}
  • 希望您使用的是 .Net 4.5.2。如果是,那么您需要启用属性路由。请检查我的更新答案
  • @Kalyan 您正在混合 asp.net 核心和 web API 2 代码。我不相信 [controlller] 占位符在 web api 2 中有效,您还需要在控制器上使用 RoutePrefix 而不是 Route。动作很好。
  • 我可以通过在 config.Route - routeTemplate: "api/{controller}/{action}/{id}" 和我的 Controller 中添加操作来获得结果,而不是[Route("LoadReport")],我更改为 ActionName("LoadReport") 以及 [HttpGet] 属性。
  • 由于您使用的是 .Net 4.5.2,因此将控制器级别属性更改为 [RoutePrefix("api/Data")]。请检查我的更新答案
【解决方案2】:

在 WebApiConfig.cs 中:

public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

在我的控制器中:

namespace WebAPIa.Controllers
{
   // [Route("api/[controller]")]
    public class DataController : ApiController
    {
        [ActionName("LoadReport")]
        [HttpGet]
        public HttpResponseMessage LoadReport()
        {

           return Request.CreateResponse("Testing LoadReport");
        }

        [ActionName("LoadReport2")]
        [HttpGet]
        public HttpResponseMessage LoadReport2()
        {
            return Request.CreateResponse("Testing LoadReport2");
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2017-04-07
    • 2014-01-18
    • 2018-06-17
    • 1970-01-01
    相关资源
    最近更新 更多