3

ドキュメント ストリームを特定の型のアクション メソッドとして公開しようとしています。次のようになります。

/odata/MyType(123)/stream <-- これはデータのバイナリ ストリームを返します。

GET を使用して上記のエンドポイントにアクセスすると、エンドポイントがコントローラーで [HttpGet] として公開されているにもかかわらず、404 しか返されません。

Get 動詞を使用してこのリソースにアクセスすることは意味的に理にかなっています。これは単にデータを取得するための操作であり、副作用ではないためです。

これまでのところ、アクション メソッドを POST 動詞の下に公開することによってのみ、これを機能させることができました。

現在、アクション メソッド コントローラーの実装は次のようになっています。

[HttpPost] // <-- I want this to be [HttpGet]
public HttpResponseMessage Test([FromODataUri] int key, ODataActionParameters parameters)
{
    var fileStream = File.OpenRead(@"c:\somefile");

    return new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StreamContent(fileStream)
        };
}

「MyType」にアクションメソッドを登録するコード

var entityTypeConfiguration = mapper.Builder.Entity<MyType>();
var actionConfiguration = entityTypeConfiguration.Action("stream");
actionConfiguration.Returns<HttpResponseMessage>();

実装は、次の記事に触発されています: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-actions

このアクション メソッドを Get として公開する方法を知っている人はいますか?

4

2 に答える 2

3

質問は古いですが、私はこれに苦労しており、私の場合に見つけた解決策は他の人にとって役立つかもしれません.「アクション」GETを「アクション」ではなく「関数」として定義してください。

質問で提示されたシナリオでは、これは次のようになります。

var actionConfiguration = entityTypeConfiguration.Function("stream");

これはドキュメントで推奨されています。「アクションと関数の違いは、アクションには副作用があり、関数には副作用がないことです。アクションと関数の両方がデータを返すことができます。」

于 2016-03-16T12:00:55.313 に答える