0

新しい MVC WebApi プロジェクトをビルドしているときに、投稿アクションが正しく機能していないように見える問題に遭遇しました。

次のアクションがあります。

//--
//-- POST: /api/groups/subscribe/1/groups
[HttpPost]
public GroupResponse Subscribe(int id, List<int> groups )
{
    var response = new GroupResponse();
    var manager = new UserManagement();

    try
    {
        response.Status = 1;

    var subscribedGroups = manager.GetSubscribedGroups(id).Select(g => g.GroupId).ToList();
    foreach (var subscribedGroup in subscribedGroups.Where(groups.Contains))
    {
        groups.Remove(subscribedGroup);
    }

    //-- group is a reserved word @ escapes this and treats it as a regular variable
    foreach (var @group in groups.Where(g => !manager.JoinGroup(id, g)))
    {
        response.Status = 2;
        response.ErrorMessage = Constants.SUBSCRIBE_FAIL;
    }
    }
    catch (Exception)
    {
        response.Status = 2;
        response.ErrorMessage = Constants.SUBSCRIBE_FAIL;
        return response;
    }

    return response;
}

レスト キットからこのアクションを使用しようとすると、次のエラー メッセージが表示されます。

{
    "Message":"No HTTP resource was found that matches the request URI 'http://localhost:50393/api/groups/subscribe'.",
    "MessageDetail":"No action was found on the controller 'Groups' that matches the request."
}

フィドラーを介してアクションを実行しようとしましたが、API に送信されているデータを API が無視しているようで、現時点では混乱しています。

/api/groups/subscribe?id=1 のように API を使用しようとすると、API アクションが実行されますが、必要なリストを渡すことができません。

これを試して処理するためのルートも設定しましたが、まったく役に立たないようです:

config.Routes.MapHttpRoute(
    "subscribe",
    "api/groups/subscribe/{id}/{groups}",
    new { controller = "Groups", action = "Subscribe", id = RouteParameter.Optional, groups = RouteParameter.Optional 
});

追加情報: フィドラーでテストするとき、次のように自分のリクエストを作成しています:

リクエスト ヘッダー: ユーザー エージェント: Fiddler ホスト: localhost:50393 コンテンツの長さ: 29 コンテンツ タイプ: アプリケーション/json; 文字セット=utf-8

リクエスト本文: {"id":1,"groups":[1,2,3,4,5]}

4

1 に答える 1

1

これを試すことができます。今はフィドラーでテストされています。

コントローラー:

public class AuthenticationController : ApiController
{
    [AcceptVerbs("POST")]
    public void Subscribe(SubscribeClass data)
    {
        //Do your stuff here
        int id = data.id;
        List<int> groups = data.groups;
        //data contains values
    }

    public class SubscribeClass
    {
        public int id { get; set; }
        public List<int> groups { get; set; }
    }
}

WebApiConfig:

    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "AuthenticateUser",
            routeTemplate: "{controller}/{action}",
            defaults: new { },
            constraints: new { controller = "Authentication", action = "Subscribe" }
        );
    }

Fiddler 経由で送信される JSON オブジェクト:

{ "id": 1 , "groups": [1, 2, 3, 4, 5]  }

Fiddler のヘッダー セクションで、シナリオに合わせて次のヘッダーを追加してください。

Content-Type: application/json; charset=utf-8

次に、POST URL

http://localhost/api/Authentication/Subscribe

お役に立てれば。

于 2013-10-03T11:58:27.900 に答える