6

API ヘルプ ページにすべての API エンドポイントを表示し、希望するスタイルで表示するのに苦労しています。

ここに私のルートがあります:

config.Routes.MapHttpRoute("Orgs", "v1/Orgs/{orgId}", 
new { controller = "Orgs", orgId = RouteParameter.Optional });

config.Routes.MapHttpRoute("OrgDescendants", "v1/Orgs/{orgId}/Descendants", 
new { controller = "Orgs", action = "OrgDescendants" });

ここにすべてのコントローラーメソッドがあります:

[HttpGet]
public IEnumerable<Org> GetAllOrgs()

[HttpGet]
public Org Get(string orgId)

[HttpGet]
[ActionName("OrgDescendants")]
public List<Org> Descendants(string orgId)

[HttpPost]
public HttpResponseMessage Post(Org org)

[HttpPut]
public HttpResponseMessage Put(string orgId, Org org)

[HttpDelete]
public void Delete(string orgId)

ヘルプ ページに表示されるエンドポイントは次のとおりです。

GET v1/Orgs
POST v1/Orgs
PUT v1/Orgs/{orgId}
DELETE v1/Orgs/{orgId}
GET v1/Orgs/{orgId}/Descendants

ご覧のとおり、ヘルプ ページには次のエンドポイントがありません。

GET v1/Orgs/{orgId}

私は非常に多くの異なるルーティング順列を試しましたが、見失ってしまいました。何を試しても、エンドポイントが見つからないか、「正しく」フォーマットされていないことが常にあります。

たとえば、私は次のようになります。

GET v1/Orgs/{orgId}/Get

私がしたいとき:

GET v1/Orgs/{orgId}

または私は次のようになります:

PUT v1/Orgs?orgId={orgId}

私がしたいとき:

PUT v1/Orgs/{orgId}

どんな組み合わせを試しても、思い通りにはいかないようです。どんな助けでも大歓迎です!

4

1 に答える 1

0

通常、この種の問題は、プロジェクトのアーキテクチャ (階層) に問題がある場合に発生します。

さらに、別の方法でルーターを追加することもできます。例えば:

RouteTable.Routes.Add(
            "UserProfiles",
            new Route("Profile/{uid}/{mode}", new ProfileRouterHandler("~/Profile/Default.aspx")));

ルーター ハンドラは次のようになります。

public class ProfileRouterHandler: IRouteHandler
{
    private string VirtualPath { get; set; }
    public ProfileRouterHandler()
    {

    }

    public ProfileRouterHandler(string virtualPath)
    {
        VirtualPath = virtualPath;
    }

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string param = requestContext.RouteData.Values["uid"] as string;
        string mode = requestContext.RouteData.Values["mode"] as string;
        long id;
        long.TryParse(param, out id);
        if (id > 0)
        {
            string filePath = "~/Profile/Default.aspx?uid=" + param + (!string.IsNullOrEmpty(mode) ? "&mode=" + mode : "");
            VirtualPath = "~/Profile/Default.aspx";
            HttpContext.Current.RewritePath(filePath);
        }
        else
        {
            string filePath = "~/Profile/" + param + ".aspx";
            VirtualPath = filePath;
            HttpContext.Current.RewritePath(filePath);
        }

        return BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as Page; 
    }
}

これが役立つことを願っています。

于 2013-09-18T13:55:04.297 に答える