为什么我在调用webservice函数时出错?

时间:2016-01-26 02:15:19

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

我正在编写一个C#web api 2 webservice,并希望获得一些帮助,以便将请求中的单个项目提供给Web服务。

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

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

以下是网络服务功能:

// 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网站的用户名称:

http://localhost/thephase

以下是我访问的uri:

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

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

  

{“Message”:“找不到与请求URI匹配的HTTP资源   'http://localhost/thephase/api/GetItem/1'。“,”MessageDetail“:”没有类型   被发现匹配名为'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函数吗?

2 个答案:

答案 0 :(得分:3)

因为您正在使用属性路由,所以您还需要为其指定参数。

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

Route Prefixes

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

答案 1 :(得分:1)

Idintint是值类型。值类型不能为null。您将参数设置为RouteParameter.Optional,但如果它是可选的,则必须能够将其指定为null。

解决方案:使用可空的int

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