1

ほとんどのホストされたサイトで Put と Delete を使用できないため、これらの使用を回避するルートを作成しようとしていますが、それを機能させることはできません..

こんなルートが欲しい

api/someController/Add/someInt

このRESTsharpコードで

private RestClient client;

public RESTful()
    {
        client = new RestClient
        {
            CookieContainer = new CookieContainer(),
            BaseUrl = "http://localhost:6564/api/",
            //BaseUrl = "http://localhost:21688/api/",
            //BaseUrl = "http://madsskipper.dk/api/"
        };
    }

    public void AddFriend(int userId)
    {
        client.Authenticator = GetAuth();

        RestRequest request = new RestRequest(Method.POST)
        {
            RequestFormat = DataFormat.Json,
            Resource = "Friends/Add/{userId}"
        };

        request.AddParameter("userId", userId);

        client.PostAsync(request, (response, ds) =>
        {
        });
    }

FriendsController でこのメソッドをヒットするには

// POST /api/friends/add/Id
[HttpPost] //Is this necesary?
public void Add(int id)
{         
}

だから私は私のルート設定にこれを追加しました

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

しかし、これを行うと、Add メソッドではなく、FriensController のコンストラクターのみをヒットします。

編集:

また、このルート構成を作成してみました

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

しかし、同じ結果、コントローラーはヒットしますが、アクションはヒットしません


解決策: パラメータが RESTsharp で間違って追加されていることが判明したため、代わりに

    RestRequest request = new RestRequest(Method.POST)
    {
        RequestFormat = DataFormat.Json,
        Resource = "Friends/Add/{userId}"
    };

    request.AddParameter("userId", userId);

そのはず

        RestRequest request = new RestRequest(Method.POST)
        {
            RequestFormat = DataFormat.Json,
            Resource = "Friends/Add/{userId}"
        };

        request.AddUrlSegment("userId", userId.ToString());
4

1 に答える 1

2

Api ルート定義にアクション名を含めることができます。

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

次に、このアクションを実行します。

[HttpPost]
public void Add(int id)
{

}

/api/friends/add/123これで、 URLへの POST リクエストをトリガーできます。

この[HttpPost]属性は、このアクションが POST 動詞を使用してのみ呼び出されることを保証します。削除しても GET を介して呼び出すことはできますが、サーバーの状態を変更する可能性のあるアクションではこれを行うべきではありません。

于 2012-07-20T06:07:52.047 に答える