我正在尝试制作路线,但在这种情况下不起作用:
如果我打电话:
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中的值。我忘了什么吗?
答案 0 :(得分:2)
好吧,我仍然看不到你的第一个网址是如何工作的,但是第二个网址的问题是你试图传递一个无效的数据作为参数。
为了简单起见,我只是假装你的路线定义是这样的:
routeTemplate: "api/{controller}/{type}/{id}",
defaults: new { id = RouteParameter.Optional }
如果您要在此网址http://mysite.com/product/Generic
上拨打GET,那么您将遇到与此相同的错误。此URL将解析 ProductController 的控制器,其参数名为 type ,其值为 Generic 。
但是,您的type
参数的实际类型为GType
,这是一个枚举。通用不是有效值,因此发生错误。它与发送“abcd”作为int
参数的值相同。
如果您尝试调用get http://mysite.com/product/Big
,它会起作用,因为它可以解析该值(Big)和GType
枚举的成员。
答案 1 :(得分:2)
问题在于我有两条等号路线,但名称参数不同。
api/{version}/{controller}/{type}/{id}
和
api/{version}/{controller}/{id}
第二个必须是宣布的最后一条路线。
答案 2 :(得分:0)
您向我们展示的路线与您尝试点击的网址不匹配。我有一种感觉,你正在寻找错误的路线。另外,"/Product/"
不应该是/{controller}/"
?
哦,你在片段中错误地拼写了routeTamplate
[原文如此]。我认为这是一个转录错误 - 我很确定编译器会抨击它。