【发布时间】:2013-06-02 20:20:11
【问题描述】:
我有一个控制器,它包含两个不同的 Get 方法。一个采用int 值,而另一个采用String 值,如下所示:
public class AccountController : ApiController
{
public String GetInfoByString(String sUserInput)
{
return "GetInfoByString received: " + sUserInput;
}
public String GetInfoByInt(int iUserInput)
{
return "GetInfoByInt received: " + iUserInput;
}
}
我的RouteConfig.cs没有改动,如下:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
我的WebApiConfig.cs也没有动过,如下:
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
我希望能够通过使用单个链接来访问 Web API:
// Hit GetInfoByInt
http://localhost:XXXX/api/account/1
// Hit GetInfoByString
http://localhost:XXXX/api/account/abc
我可以很好地打第一种情况,但是每当我尝试打第二种情况时,我都会收到以下错误:
<Error>
<Message>The request is invalid.</Message>
<MessageDetail>
The parameters dictionary contains a null entry for parameter 'id' of
non-nullable type 'System.Int64' for method 'TestProject.String GetInfoByInt(Int64)' in 'TestProject.Controllers.AccountController'.
An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
</MessageDetail>
</Error>
有没有办法根据用户提供String 或int 来点击Get 方法?我假设需要在 RouteConfig 或 WebApiConfig 中进行更改,但我不太确定如何解决这个问题。也许这毕竟只是一个简单的解决方案?
另外,如果重要的话,我希望能够使用包含字母和数字的 String 来访问 GetInfoByString,例如 'ABC123' 或 '123ABC'。 GetInfoByInt 可以是 '123'
如果可能的话,我真的很想坚持一个控制器,而不是把它分成多个控制器。
提前感谢您的帮助。
【问题讨论】:
-
一个 Get 意味着被 web 请求击中,而另一个意味着被其他控制器或代码击中?为什么每个都需要一个 Get 方法?在调用方法之前,只需保留字符串 1 并在 int 中运行 ToString()。
-
如果您只有两种方法,另一种“hack”是将 HttpGet 属性应用于其中一种方法。
-
如果你完成了这个,你必须确保没有有效的字符串标识符可以被解析为整数。例如,如果这是用户生成的,并且有人创建了一个字符串标识符“1”,它将路由到整数方法。
标签: c# asp.net asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing