9

ルート テンプレートを設定しました。

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

コントローラのアクション シグネチャ:

public IEnumerable<object> Get(Int64 id,string abc)

URL http://mymachine.com/api/Individuals/1?abc=4と一致させようとしましたが、例外が発生します

{"$id":"1","Message":"エラーが発生しました。","ExceptionMessage":"オブジェクト参照がオブジェクトのインスタンスに設定されていません。","ExceptionType":"System.NullReferenceException", "StackTrace":" System.Web.Http.ValueProviders.Providers.RouteDataValueProvider.d__4.MoveNext() で\r\n

奇妙なことに、http://mymachine.com/api/Individuals?id=1&abc=4はコントローラー、アクション、およびパラメーターと一致します。

"api/{controller}/ {id} /{*wildcard}"の " {id} " が動くと思いました。

なんで?

4

2 に答える 2

13

ワイルドカードは、URI の残りの部分をルート パラメーターに一致させるようにルーティング エンジンに指示します (例については、この記事の「出版日で書籍を取得する」セクションを参照してください)。

これは、任意の名前付き変数を任意のパラメーターに一致させることを意味するものではありません。これは、ルート構成に関係なく、WebApi がデフォルトでクエリ文字列の項目に対して行うことです (したがって、2 番目の URI が機能した理由 - どのルートにも一致しませんでした)。

オプションとしてマークされていない{id}パラメーターが呼び出されることを期待していたため、ルートで一致しませんでした。{wildcard}

たとえば、単純に「wildcard」を「abc」に変更した場合:

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

次に、次の URI に正常に一致します。

http://mymachine.com/api/Individual/1/a/b/c

値でid=1, abc=a/b/c

修正するには、ルートからワイルドカードを削除するだけで、次のようになります。

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new {id = RouteParameter.Optional});
于 2013-11-01T12:02:55.527 に答える
5

gooidからの答えは正しいです。質問の2番目の部分に答えたいだけです:

奇妙なことに、http://mymachine.com/api/Individuals?id=1&abc=4はコントローラー、アクション、およびパラメーターと一致します。

id = RouteParameter.Optional があるため、ルートが id を提供しない場合でも、ルート テンプレートと一致します。プレースホルダー {*wildcard} はルートの残りを探し、キー「wildcard」の下のルート ディクショナリに配置します。この場合、空の文字列 (または null) です。

クエリ パラメータもルート ディクショナリに入ることに注意してください。したがって、ルート辞書は次のようになります: { "id": "1", "abc": "4", "wildcard": ""}

詳細については、http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api を参照してください。

于 2014-07-31T21:18:15.357 に答える