我有一个控制器,其中包含两种不同的 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>
有没有办法根据用户提供的是 aString
还是a 来点击 Get 方法int
?我假设需要在 RouteConfig 或 WebApiConfig 中进行更改,但我不太确定如何解决这个问题。也许这毕竟只是一个简单的解决方案?
另外,如果重要的话,我希望能够使用String
包含字母和数字的 GetInfoByString ,例如'ABC123'
or '123ABC'
。GetInfoByInt 可以类似于'123'
如果可能的话,我真的很想坚持一个控制器,而不是把它分成多个控制器。
提前感谢您的帮助。