0

そこで、WebAPI アプリの概念実証プロトタイプを作成しています。通常の方法はすべてうまく機能します。しかし、WebAPI を介してカスタム メソッドを呼び出すこともできることを示したかったのです。したがって、RouteConfig.cs には次のルーティングがあります。

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

コントローラーには、簡単な方法があります。

[HttpGet]
public string Test()
{
    return "this is a string";
}

メソッドを呼び出そうとするとhttp://localhost:43225/api/values/test、ブラウザに次のエラーが表示されます。

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.String Get(Int32)' in 'WebAPI_Listener.Controllers.ValuesController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
</string>

しかし、URL の最後に ID を指定するとhttp://localhost:43225/api/values/test/1、メソッド自体はパラメーターをまったく取りませんが、機能します。

したがって、ルーティングで id} をオプションとして設定している場合、{id} を指定しないと機能しないのはなぜですか。ただし、メソッド自体が { ID}??

4

1 に答える 1

5

~/App_Start/WebAPIConfig.cs Register メソッドで API ルートを宣言する必要があります。WebAPIConfig のキャッチオール ルートは RouteConfig ルートより優先されるため、ルートが選択されることはありません。

あなたのものと同様のルートを WebAPIConfig に追加する例を次に示します。この例には欠点があります。このルートに一致するコントローラーの HTTP 動詞を明示的に指定する必要があります (つまり、~/localhost:43225/api/values/5 ではなく ~/api/values/get/5)。

        config.Routes.MapHttpRoute(
            name: "CustomAPIActions",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        ); 

この欠点を回避するには、次のように特定のコントローラーへのルートを制限できます。

        config.Routes.MapHttpRoute(
            name: "ApiNonCrudActionsForMyController",
            routeTemplate: "MyController/{action}/{id}",
            defaults: new { controller = "MyController", id = RouteParameter.Optional }
        ); 

標準の動詞を維持するために、コントローラーとアクションへのルートを制限することもできますが、これを頻繁に行うと、メンテナンスの問題や混乱の原因になる可能性があります。

        config.Routes.MapHttpRoute(
            name: "ApiNonCrudActionsForMyController",
            routeTemplate: "MyController/Test/{id}",
            defaults: new { controller = "MyController", action = "Test", id = RouteParameter.Optional }
        ); 

詳細とその他のアプローチについては、http: //encosia.com/rest-vs-rpc-in-asp-net-web-api-who-cares-it-does-both/を確認してください。また、アクションを HTTP 動詞に制限し、カスタム アクション用のコントローラーを追加することも検討できます (例: ~/localhost:43225/api/TestValues/5)。

于 2012-09-12T20:02:45.203 に答える