0

次のパターンを許可する Web API で RouteConfig を作成しようとしています。

パターン:

/api/{controller}
/api/{controller}/{id} (int, optional)

/api/{controller}/{action}
/api/{controller}/{action}/{id} (int, optional)

使用例:

/api/profile/ (get all profiles)
/api/profile/13 (get profile number 13)

/api/profile/sendemail/ (send email to all profiles)
/api/profile/sendmail/13 (send email to profile number 13)

私が試しているのは次のとおりです。

routes.MapHttpRoute(
    name: "ControllerAndID",
    routeTemplate: "api/{controller}/{id}",
    defaults: null,
    constraints: new { id = @"^\d+$" } // Dekkar heiltölur eingöngu í id parameter
);

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { action = "Get", id = RouteParameter.Optional }
);

私が得ているエラーは次のとおりです。

要求に一致する複数のアクションが見つかりました: タイプ MinarSidur.Controllers.ProfileController の \r\nMinarSidur.Models.DataTransfer.UserProfileDTO sendmail(System.String)\r\nタイプ MinarSidur.Models.DataTransfer.UserProfileDTO sendpaycheck(System.String) MinarSidur.Controllers.ProfileController

これを達成するのを手伝ってもらえますか?

4

2 に答える 2

1

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" }
        );
于 2012-11-21T14:34:42.223 に答える
0

ルールが重複しています。ルーティングでの ID の検証は大きな損失になるでしょうか? Get アクション内で Id パラメーターを int として使用することもできます。その場合は、 ControllerAndIDを完全に削除して、すべてのユースケースに一致する 2 番目のものを使用できると思います。

于 2012-11-21T13:43:05.643 に答える