Web 服务的 C# Web API 路由

本文关键字:Web 路由 API 服务 | 更新日期: 2023-09-27 18:31:54

我正在用 c# 编写一个 web api,我有一个关于访问名为 test 的函数的正确路由的问题。

下面是类定义:

[RoutePrefix("api")]
public class ItemsWebApiController : ApiController

我有一个RoutePrefix如下:

[Route("test")]

这是名为test的函数:

[Route("test")]
[System.Web.Http.AcceptVerbs("GET")]
[System.Web.Http.HttpGet]
public String test()
{
    return "test";
}

我正在尝试访问以下网址:http://localhost/api/test

上述 url 显示以下异常:

"/"应用程序中的服务器错误。

找不到资源。

说明:HTTP 404。您要查找的资源(或其之一) 依赖项)可能已被删除,其名称已更改,或者 暂时不可用。 请查看以下网址并制作 确保拼写正确。

请求的网址:/api/test

如何访问 test 函数,以便在浏览器中显示字符串"test"

编辑

我已部署到本地 IIS,并且数据库连接字符串工作正常。

本地 IIS 的地址是 http://localhost/

这些是我尝试过的网址:

http://localhost/test

http://localhost/api/test

http://localhost/api/test/test

http://localhost/ItemsWebApiController/test

http://localhost/ItemsWebApi/test

以上所有内容都返回错误页面。

谢谢

Web 服务的 C# Web API 路由

如果你是一个推杆[Route("test")]你的网址将被http://address/test

如果您需要像 http://address/api/test 这样的网址,请像 [Route("api/test")] 一样更改您的路线

注意:您还需要添加[HttpGet]

您必须

在 WebAPI 控制器中激活属性路由

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
           name: "DefaultApi",
           routeTemplate: "api/{controller}/{id}",
           defaults: new { id = RouteParameter.Optional }
        );
    }
}

并在您的应用程序中开始

protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
}

然后你的 URL http://localhost/test ,因为默认路由在这里不匹配。

根据您的配置,路由将为: http://address/api/test/test第一个test是属性 [Route("test")] 中的路由前缀;SCOND test是控制器中在方法上定义的属性中的操作

[Route("test")]
public String test()
{

Web API 会根据操作名称推断 http 方法。它不会从"测试"中知道要使用什么。

查看文档

HTTP方法

Web API 还根据请求的 HTTP 方法(GET、POST 等)选择操作。默认情况下,Web API 会查找与控制器方法名称开头不区分大小写的匹配项。例如,名为 PutCustomers 的控制器方法与 HTTP PUT 请求匹配。

您可以通过使用以下任何属性修饰 mathod 来覆盖此约定:

  • [删除]
  • [HttpGet]
  • [HttpHead]
  • [HttpOptions]
  • [HttpPatch]
  • [维基邮报]
  • [HttpPut]

下面的示例将 CreateBook 方法映射到 HTTP POST 请求。

[Route("api/books")]
[HttpPost]
public HttpResponseMessage CreateBook(Book book) { ... }