3

いくつかのPOCOクラスを使用してMVC4WebApiアプリケーションを作成し、EFを使用して読み取り/書き込みなどのクイックデフォルトコントローラーを作成しました。

どういうわけか、これら2つの方法を一緒に機能させることはできませんが、最初の方法はEFが作成したものです。つまり、IDとユーザー名でユーザーを検索したいと思います。

    // GET api/xxx
    public User GetUser(string id)
    {
        User user = db.Users.Find(id);
        if (user == null)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
        }
        return user;
    }

上記は動作します。これは動作しません。

    // GET api/xxx
    public User GetUserByUsername(string username)
    {
        var user = db.Users.First(s => s.Username == username);
        if (user == null)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
        }

        return user;
    }

しかし、それを次のように少し変更し、webapi構成にいくつか追加すると、次のように機能します。

    // GET api/xxx
    [HttpGet]
    [ActionName("username")]
    public User GetUserByUsername(string id)
    {
        var user = db.Users.First(s => s.Username == id);
        if (user == null)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
        }

        return user;
    }

そして、WebApiConfigを次のように変更します。

      config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        // Action-name
        config.Routes.MapHttpRoute(
            name: "ActionApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        ); 

以前の方法(1番目と2番目の方法)が一緒に機能しない理由と、可能であればそれを機能させるために何ができるかを知りたいです。同様のメソッドを作成できないのは少し奇妙に思えるので、何かがあると確信しています。

4

3 に答える 3

3

Web API は、メソッドが「GET」であるという事実だけを検索し、メソッド名に「get」という単語を検索するためです。両方のメソッドに「get」があり、両方とも単一の文字列パラメーターを受け入れるため、コントローラーはおそらく最初に見つかったものに解決され、「id」はデフォルトルートの一部であるため、GetUser メソッドで返されます。

「ユーザー名」のルートを追加することもできます。

config.Routes.MapHttpRoute(
        name: "ActionApi",
        routeTemplate: "api/{controller}/{username}",
        defaults: new { username = RouteParameter.Optional }
    ); 

編集:これらの記事を見て、ルーティングが Web API でどのように機能するかを確認してください。通常の MVC コントローラーとは異なります。

http://www.asp.net/web-api/overview/web-api-routing-and-actions

于 2013-03-14T16:05:14.197 に答える
0

DefaultApi の後に新しいルーティング ルールを追加して機能させました。

// Routing by Action-name
config.Routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{username}",
    defaults: new { username = RouteParameter.Optional }
);

メソッドを次のように変更します。

// GET api/xxx/username
[ActionName("username")]
public User GetUserByUsername(string username)
{
    var user = db.Users.FirstOrDefault(s => s.Username == username);
    if (user == null)
    {
        throw new HttpResponseException(
            Request.CreateResponse(HttpStatusCode.NotFound));
    }

    return user;
}

頑張りすぎてばかげていたと思いますが、今ではかなりはっきりしているようです。

routeTemplateに適用する新しいルーティングを追加すること{action}は理にかなっています。その後、属性を追加できるからです[ActionName("username")]。次に、2 番目のルーティング ルールがアクションを受け入れるため、両方の GET メソッドを機能させるlocalhost:xxxxx/api/xxx/2ANDを参照できます。localhost:xxxxx/api/xxx/username/bob

@Rob、リンクとヒントをありがとう、ありがとう!

于 2013-03-15T10:43:30.940 に答える
0

これ:

var user = db.Users.First(s => s.Username == id);

そのIDを持つユーザーが見つからない場合、例外が発生します

でもこれは:

これ:

var user = db.Users.FirstOrDefault(s => s.Username == id);

代わりに戻りnullます。

于 2013-03-14T15:58:15.393 に答える