为什么我在调用 Web 服务函数时收到错误

本文关键字:错误 函数 服务 调用 Web 为什么 | 更新日期: 2023-09-27 18:31:56

我正在编写一个 C# Web api 2 网络服务,并希望得到一些帮助,以便从请求到 Web 服务获取单个项目。

下面是 Web 服务控制器类代码:

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

以下是 Web 服务函数:

// GET: api/Getitem/1
[Route("Getitem")]
[System.Web.Http.HttpGet]
[ResponseType(typeof(Item))]
public async Task<IHttpActionResult> GetItem(int id)
{
    Item item = await db.items.FindAsync(id);
    if (item == null)
    {
        return NotFound();
    }
    return Ok(item);
}

以下是 IIS 网站的 URI:

http://localhost/thephase

这是我正在访问的 URI:

http://localhost/thephase/api/Getitem/1

以下是浏览器中显示的错误:

{"消息":"找不到与请求 URI 匹配的 HTTP 资源 "http://localhost/thephase/api/GetItem/1","消息详细信息":"无类型 找到与名为"GetItem"的控制器匹配的控制器。

这是WebApiConfig代码:

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 }
        );
        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
    }
}

该错误指出控制器被命名为 'GetItem' ,这是不正确的。因此,我认为问题出在WebApiConfig路由代码上。

如果我从函数中删除int id,则正确调用该函数。

这是没有参数的相同函数:

// GET: api/Getitemnoparameter
[Route("Getitemnoparameter")]
[System.Web.Http.HttpGet]
[ResponseType(typeof(Item))]
public async Task<IHttpActionResult> GetItem()
{
    Item item = await db.items.FindAsync(1);
    if (item == null)
    {
        return NotFound();
    }
    return Ok(item);
}

以下 uri 可正确访问该函数:

http://localhost/thephase/api/Getitemnoparameter

所以问题与int参数有关。

有人可以帮我使用参数访问GetItem函数吗?

为什么我在调用 Web 服务函数时收到错误

由于您使用的是属性路由,因此还需要指定参数才能使其正常工作。

查看本教程以更好地理解。

路由前缀

[Route("Getitem/{id:int}")]

Id是一个intint是一种值类型。值类型不能为空。将参数设置为 RouteParameter.Optional ,但如果它是可选的,则必须能够为其分配 null。

解决方案:使用可为空的 int

public async Task<IHttpActionResult> GetItem(int? id)