Profile
あなたの例外は、実際には、コントローラー上のこれら2つのメソッド間の競合であることに不満を持っていました。
- sendpaycheck(文字列)
- sendmail(文字列)
GetとGet(?)ではありません。これも問題になりますが。
実際、変更を加えたりアクションをトリガーしたりするRPCアクションを実行するときは、POST動詞を使用する必要があります。これを行うことにより、上記のルーティングの問題を解決する必要があります。
更新しました
問題に対して、よりリソース中心のアプローチを検討しましたか?ここでのすべての場合、リソースは「プロファイル」であり、一意のIDがxであるように見えます。他に2つの可能な一意のIDの電子メールとssnもあるようです。
これらが許容できるURLである場合
http://localhost/api/profile
http://localhost/api/profile/x
http://localhost/api/profile/?email=myemail@x.com
http://localhost/api/profile/?ssn=x
あなたが使用できる:
public class ProfileController : ApiController
{
public string Get(int id)
{
return string.Format("http://localhost/api/profile/{0}", id);
}
public string Get([FromUri] string email = null, [FromUri] int? ssn = null)
{
if (!string.IsNullOrEmpty(email))
{
return string.Format("http://localhost/api/profile/?email={0}", email);
}
if (ssn.HasValue)
{
return string.Format("http://localhost/api/profile/?ssn={0}", ssn.Value);
}
return "http://localhost/api/profile";
}
}
標準のwebapiルーティングだけで:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
だが
/emailと/ssnを続行したい場合は、電子メールに問題がある可能性があります...特に「。」に問題があります。電子メールアドレスにこれがルーティングエンジンを混乱させる可能性があります...これが機能するためには、末尾にスラッシュを付ける必要があります。つまり、機能しないhttp://localhost/api/profile/email/me@me.com/
ことがわかると思いますhttp://localhost/api/profile/email/me@me.com
。
これは以下をサポートします:
http://localhost/api/profile
http://localhost/api/profile/x
http://localhost/api/profile/email/myemail@x.com/
http://localhost/api/profile/ssn/x
私はこれを試して使用します(注:ルートを区別するための名前rpcIdの使用):
public class ProfileController : ApiController
{
public string Get(int id)
{
return string.Format("http://localhost/api/profile/{0}", id);
}
public string Get()
{
return "http://localhost/api/profile";
}
[HttpGet]
public string Ssn(int rpcId)
{
return string.Format("http://localhost/api/profile/ssn/{0}", rpcId);
}
[HttpGet]
public string Email(string rpcId)
{
return string.Format("http://localhost/api/profile/email/{0}", rpcId);
}
}
その場合、私のルーティングは次のようになります。
config.Routes.MapHttpRoute(
name: "ProfileRestApi",
routeTemplate: "api/profile/{id}",
defaults: new { id = RouteParameter.Optional, Controller = "Profile" }
);
config.Routes.MapHttpRoute(
name: "PrfileRpcApi",
routeTemplate: "api/profile/{action}/{rpcId}",
defaults: new { Controller = "Profile" }
);