3

目標は、次の 4 つのエンドポイントを許可することです。

POST    v1/invoices<br/>
POST    v1/invoices/12345<br/>
POST    v1/invoices/12345/attachment<br/>
POST    v1/invoices/12345/image

ルーティング エントリ:

routes.MapHttpRoute(
        name: "InvoiceAttachments",
        routeTemplate: "v1/invoices/{id}/attachments",
        defaults: new { controller = "invoices", action = "PostAttachment" }
    );

routes.MapHttpRoute(
        name: "InvoiceImages",
        routeTemplate: "v1/invoices/{id}/images",
        defaults: new { controller = "invoices", action = "PostImage" }
    );

これらは、コントローラーでの私の 4 つの関数定義です。

[HttpPost]
[ActionName("PostAttachment")]
public HttpResponseMessage PostAttachment(int id)

[HttpPost]
[ActionName("PostImage")]
public HttpResponseMessage PostImage(int id)

[HttpPost]
public HttpResponseMessage Post(int id)    

[HttpPost]
public HttpResponseMessage Post()

しかし、最初の URI を使用して請求書を投稿すると、認識されるルートは添付ファイル ルートです。ID 変数の後に異なるセクションを持つエンドポイントを設定するにはどうすればよいですか?

4

4 に答える 4

7

とった!

ルート:

routes.MapHttpRoute(
        name: "InvoiceStuff",
        routeTemplate: "v1/invoices/{id}/{*action}",
        defaults: new { controller = "invoices", action = "" }
    );

関数定義:

[HttpPost]
[ActionName("Attachments")]
public HttpResponseMessage Attachments([FromUri]int id)

[HttpPost]
[ActionName("Images")]
public HttpResponseMessage Images([FromUri]int id)

[HttpPost]
public HttpResponseMessage Post()

[HttpPost]
[ActionName("")]
public HttpResponseMessage Post([FromUri]int id)

完璧に動作します。ワイルドカードを使用した webAPI ルーティングの欠陥のため、ルートでデフォルト アクション "" を指定したことに注意してください。デフォルトを実行していなければ、null 参照例外がスローされていました。この欠陥の詳細については、http: //aspnetwebstack.codeplex.com/workitem/718を参照してください。ASP.NET v5 で修正される予定です。

ご助力いただきありがとうございます!

于 2013-06-06T03:11:06.900 に答える
1

最後に「/attachments」がないため、最初の URI は InvoiceAttachments ルートと一致してはならないため、別のルートを定義する必要があると思います

于 2013-06-04T21:09:37.097 に答える
0

ルートを 1 つにしてみる

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

次に、次のような関数を飾ります

[HttpPost]
[ActionName("DefaultAction")]
public HttpResponseMessage Post()


[HttpPost]
public HttpResponseMessage PostImage(int id)
于 2013-06-04T22:43:35.763 に答える
0

デフォルトではなく制約を使用してみましたか?

routes.MapHttpRoute(
        name: "InvoiceAttachments",
        routeTemplate: "v1/invoices/{id}/attachments",
        defaults: new { controller = "invoices" },
        constraints: new { action = "PostAttachment" } 
    );

routes.MapHttpRoute(
        name: "InvoiceImages",
        routeTemplate: "v1/invoices/{id}/images",
        defaults: new { controller = "invoices" },
        constraints: new { action = "PostImage" } 
    );

routes.MapHttpRoute(
        name: "Default",
        routeTemplate: "v1/invoices/{id}",
        defaults: new { controller = "invoices" }
    );

アップデート:

アクションをURL部分にすることで、おそらくハックすることができます:

routes.MapHttpRoute(
        name: "InvoiceAttachments",
        routeTemplate: "v1/invoices/{id}/{action}",
        defaults: new { controller = "invoices" },
        constraints: new {action = "attachments|images"}
    );

routes.MapHttpRoute(
            name: "default",
            routeTemplate: "v1/invoices/{id}",
            defaults: new { controller = "invoices", id = RouteParameter.Optional },
            constraints: new {action = "attachments|images"}
        );

およびコントローラーメソッド:

[HttpPost]
[ActionName("attachments")]
public HttpResponseMessage PostAttachment(int id)

[HttpPost]
[ActionName("images")]
public HttpResponseMessage PostImage(int id)

public HttpResponseMessage Post(int id)

public HttpResponseMessage Post()
于 2013-06-05T16:41:23.943 に答える