0

これは、私が変更したデフォルトのルーターです。

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

これはコントローラーです:

public class ReviewCycleController : ApiController
{

    private MrdSearchServices _mrss = new MrdSearchServices();


    // GET api/reviewcycle
    public IQueryable<MrdReviewCycle> GetReviewCycles()
    {

        return _mrss.GetAllReviewCycles();
    }


    // GET api/reviewcycle/Active
    public MrdReviewCycle GetReviewCycle(String is_active)
    {
        if (!is_active.ToLower().Equals("active"))
        {
            string url = new Uri(Request.RequestUri, "/api/ReviewCycle/Active").ToString();
            var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
            {
                Content = new StringContent(string.Format("No Review Cycle with State of '{0}' could be found. The only acceptable value is 'Active'. Request should be made to {1}.", is_active, url)),
                ReasonPhrase = "Review Cycle Not Found!"
            };
            throw new HttpResponseException(resp);
        }

        return _mrss.GetActiveReviewCycle();
    }
}

しかし、次のいずれかを呼び出すと、http://localhost:2515/api/ReviewCycle/asdfまたはhttp://localhost:2515/api/ReviewCycle期待どおりの結果が得られません。両方で得られるのは の結果ですreturn _mrss.GetActiveReviewCycle();

私は一体何を間違っているのですか?

ありがとうエリック

4

1 に答える 1

0
public MrdReviewCycle GetReviewCycle(String is_active)

おそらく次のようになります。

public MrdReviewCycle GetReviewCycle(String addParam)

また、ルートにはオプションのパラメーターを 1 つしか持てず、このパラメーターは最後のパラメーターでなければならないことに注意してください。ルート定義には、2 つのオプション パラメータ ({id}および{addParam}) がありますが、これは不可能です。

また、呼び出し元の URL は次のようにする必要があります ({id}パラメーターを省略可能にすると)。

http://localhost:2515/api/ReviewCycle/123/active

あなたのコードで見られるもう 1 つの潜在的な問題は、ルートに{action}トークンがないことです。これは、標準の HTTP 動詞をアクション名として使用する必要があることを意味しますGetReviewCycle。コントローラーでGetGET 動詞を使用したため、ReviewCycle呼び出されるのはこのアクションです。

于 2012-07-16T16:21:01.970 に答える