如何使用http请求调用ApiController中的方法?

时间:2014-10-15 08:53:15

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-web-api

我有一个名为Service的ApiController。我有一个名为UpdatePrice的方法。现在我想通过收到404错误代码从另一个项目发送一个http web请求。如果我在浏览器中运行它,我会看到:

<Error>
    <Message>No HTTP resource was found that matches the request URI 'http://localhost:26769/api/service/updateprice?priceId=16&cost=1234&lastUpdate=2014-10-15 11:41:54.000'.</Message>
    <MessageDetail>No type was found that matches the controller named 'service'.</MessageDetail>
</Error>

这是ApiController:

public class Service : ApiController
{
    PriceApplication priceApp = new PriceApplication();
    public int UpdatePrice(int priceId,int cost,DateTime lastUpdate)
    {
        try
        {
            var price = priceApp.GetByPriceId(priceId);
            price.Cost = Convert.ToDecimal(cost);
            price.LastUpdate = lastUpdate;
            priceApp.Update(price);
            return cost;
        }
        catch
        {
            return -1;
        }
    }
}

这是它的路由:

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

这是请求:

string serviceUrl = string.Format("http://localhost:26769/api/service/updateprice?priceId={0}&cost={1}&lastUpdate={2}", priceId, cost, DateTime.Now);
WebRequest request = WebRequest.Create(serviceUrl);
WebResponse response = request.GetResponse();

2 个答案:

答案 0 :(得分:5)

所以你有不正确的控制器名称(它应以* Controller结尾)和错误的路由。尝试将控制器重命名为ServiceController并更新您的路线:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{priceId}/{cost}/{lastUpdate}",
    defaults: new { controller = "service", action="updateprice", priceId = RouteParameter.Optional, cost = RouteParameter.Optional, lastUpdate = RouteParameter.Optional}
);

并按照以下格式设置您的网址格式:

string serviceUrl = string.Format("http://localhost:26769/api/service/updateprice/{0}/{1}/{2}", priceId, cost, DateTime.Now);
    WebRequest request = WebRequest.Create(serviceUrl);
    WebResponse response = request.GetResponse();

[HttpGet]操作中添加UpdatePrice属性:

public class Service : ApiController
{
    PriceApplication priceApp = new PriceApplication();
    [HttpGet]
    public int UpdatePrice(int priceId,int cost,DateTime lastUpdate)
    {
        try
        {
            var price = priceApp.GetByPriceId(priceId);
            price.Cost = Convert.ToDecimal(cost);
            price.LastUpdate = lastUpdate;
            priceApp.Update(price);
            return cost;
        }
        catch
        {
            return -1;
        }
    }
}

答案 1 :(得分:0)

  1. 与其他人所说的一样,所有控制器的名称都应以Controller结尾。这是MVC和WebAPI中默认的约定。如果要为WebAPI更改它,则需要编写自定义IHttpControllerTypeResolver

  2. 如果您希望您的网址参数看起来不错,您只需要一个详细的路线。如果没有,api/{controller}/{action}/{id}具有id可选项就可以了。您发送的任何其他参数最终都会出现在查询字符串中。

  3. 如果您要通过路径或查询字符串发送对象,请在构建URL之前为每个参数使用HttpUtility.UrlEncode(param)。如果您是通过请求正文(POSTPUT)发送的,则可以按原样发送。