2

ルートを作成しようとしていますが、この場合は機能しません:

私が電話した場合:

http://mysite.com/api/v1/product/Generic/1A 

正常に動作します。

私が電話した場合:

http://mysite.com/api/v1/product?=Generic 

も動作しますが、私が呼び出すと:

http://mysite.com/api/v1/product/Generic 

次のエラーが表示されます。

{
 "Message":"The request is invalid.",
 "MessageDetail":"The parameters dictionary contains a null entry for parameter 'type'
 of non-nullable type 'GType' for method 'System.Net.Http.HttpResponseMessage 
 Get(GType)' in 'MySite.ControllersApi.V2.ProductController'. An optional parameter must 
 be a reference type, a nullable type, or be declared as an optional parameter."
}

私のルートのコード:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute
        (
            name: "DefaultApi",
            routeTemplate: "api/{version}/{controller}/{type}/{id}",
            defaults: new { id = RouteParameter.Optional, version = "v1", controller = "Product" }
        )
    }
}

public enum GType
{
    Big,
    Small,
    Generic,
}

そしてコントローラー:

public HttpResponseMessage Get(GType type)
{
    ...
}

public HttpResponseMessage Get(GType type, string id)
{
    ...
}

そのため、Web API は URL の値を解析していません。私は何かを忘れましたか?

4

3 に答える 3

2

最初の URL が実際にどのように機能するかはまだわかりませんが、2 番目の URL の問題は、パラメータとして無効なデータを渡そうとしていることです。

簡単にするために、ルート定義を次のように仮定します。

 routeTemplate: "api/{controller}/{type}/{id}",
 defaults: new { id = RouteParameter.Optional }

この urlhttp://mysite.com/product/Genericで GET を呼び出すと、実行中と同じエラーが発生します。この URL は、 Genericの値を持つtypeというパラメーターを使用して、ProductControllerのコントローラーを解決します。

ただし、パラメーターには、列挙type型である実際の Type があります。GTypeGeneric は有効な値ではないため、エラーが発生します。であるパラメーターの値として「abcd」を送信するのと同じintです。

get to を呼び出そうとすると、その値 (Big) と列挙型http://mysite.com/product/Bigのメンバーを解析できるため、機能します。GType

于 2013-09-11T04:08:36.160 に答える
0

表示されたルートは、ヒットしようとしている URL とリモートで一致しません。間違ったルートを見ているような気がします。また、"/Product/"" /{controller}/"?

ああ、あなたrouteTamplateはスニペットで [sic] のスペルを間違えました。私はそれが転記エラーだったと思います - 私はコンパイラがそれに吠えるだろうと確信しています.

于 2013-09-10T21:38:45.777 に答える