我有一个名为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();
答案 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)
与其他人所说的一样,所有控制器的名称都应以Controller
结尾。这是MVC和WebAPI中默认的约定。如果要为WebAPI更改它,则需要编写自定义IHttpControllerTypeResolver
。
如果您希望您的网址参数看起来不错,您只需要一个详细的路线。如果没有,api/{controller}/{action}/{id}
具有id可选项就可以了。您发送的任何其他参数最终都会出现在查询字符串中。
如果您要通过路径或查询字符串发送对象,请在构建URL之前为每个参数使用HttpUtility.UrlEncode(param)
。如果您是通过请求正文(POST
或PUT
)发送的,则可以按原样发送。