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

Ham*_*eza 3 c# asp.net-mvc asp.net-mvc-3 asp.net-web-api

我有一个名为ApiController的Service.我有一个名为的方法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>
Run Code Online (Sandbox Code Playgroud)

这是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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是它的路由:

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

这是请求:

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();
Run Code Online (Sandbox Code Playgroud)

Vla*_*irs 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}
);
Run Code Online (Sandbox Code Playgroud)

并格式化您的URL:

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();
Run Code Online (Sandbox Code Playgroud)

[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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)