2014-10-15 4 views
3

Service이라는 ApiController가 있습니다. 나는 그것에 UpdatePrice라는 메서드가 있습니다. 이제 404 오류 코드를 수신하여 다른 프로젝트의 http 웹 요청을 보내려고합니다.http 요청으로 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} 
); 

는 그리고이 요청입니다

<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입니다 : 내가 브라우저에서 실행하는 경우 그리고 나는 이것이 참조 :

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(); 
+1

컨트롤러 'ServiceController'의 이름을 변경하십시오. 속성 라우팅을 고려할 수도 있습니다. http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 –

+0

또한 GET이 아닌 POST를 사용하여 업데이트해야합니다. –

+0

@TrevorPilley 반환 매개 변수 (lastUpdate 및 priceId 및 비용)는 서비스 크롤러 프로젝트에서 가져오고 주 프로젝트 도메인 모델에 대한 참조가 없으므로 GET으로 전달해야합니다. –

답변

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} 
); 

을 그리고 그런 당신의 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(); 

을 그리고 당신의 UpdatePrice 행동에 [HttpGet] 속성을 추가 :

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; 
     } 
    } 
} 
+0

500 잘못된 요청 오류가 발생했으며 쿼리 문자열과 라우팅에서 lastUpdate 속성을 제거 했으므로 이제이 오류가 발생합니다. 원격 서버 오류를 반환했습니다 : (405) Method Not Allowed. –

+1

잘못된 datetime 형식과 관련된 @HamidReza 500 오류입니다. ISO 형식 또는 dd-MM-yyyy를 사용하십시오 (datetime 모델 바인더에서 사용 된 것을 기억할 수 없음). 405 또한 당신이 좀 분명히 당신의 행동에와 요청을 보내 요청을 .. 어쩌면 HttpGet로 행동을 꾸미려고하거나 차이가 무엇인지 브라우저에서 해당 링크에 액세스 해보십시오. – Vladimirs

+0

@Vladimirs는 [HttpGet]의 사용이 필요합니까 아니면 일반적인 관례입니까? –

0
  1. 다른 사람들의 말처럼, 모든 컨트롤러의 이름 Controller로 끝나야합니다. 이것은 MVC 및 WebAPI의 기본 규칙입니다. WebAPI 용으로 변경하려면 사용자 정의 IHttpControllerTypeResolver을 작성해야합니다.

  2. URL 매개 변수를 멋지게 보이게하려면 길게 작성하면됩니다. 그렇지 않은 경우 id가 선택적 인 api/{controller}/{action}/{id}은 문제가 없습니다. 추가 매개 변수를 보내면 쿼리 문자열로 끝납니다.

  3. 경로 또는 쿼리 문자열을 통해 개체를 보내는 경우 URL을 작성하기 전에 각 매개 변수에 HttpUtility.UrlEncode(param)을 사용하십시오. 요청 본문 (POST 또는 PUT)을 통해 보낸 경우 그대로 보낼 수 있습니다.

관련 문제