2017-06-06 18 views
1

私はCRUDの標準動詞を持つODataコントローラを持っています。すべてがうまくいきます。今、私はファイルアップロードを実行するカスタムアクションを追加する必要があります。私はこのように私の既存のコントローラにメソッドを追加しよう:OData v4ファイルアップロードのカスタムアクション

[HttpPost] 
[Route("UploadFile")] 
public async Task<HttpResponseMessage> UploadFile() 
{ 
    //handle uploaded content logic here... 
} 

しかし、私はPOSTを実行して、それを起動しようとすると:

http://localhost/UploadFile

私はこのエラーを取得する:

System.InvalidOperationException: No non-OData HTTP route registered. 

ファイルのアップロードを許可するこのカスタムアクションでは、どうすればよいですか?あなたがEdmModelの一部としてアクションを宣言する必要が

答えて

0

は、次の例では、私はあなたのエンティティタイプが添付であると仮定していますし、あなたのコントローラクラス名はAttachmentsControllerです。慣例により、あなたのEntitySet名は、添付

var attachments = builder.EntitySet<Attachment>("Attachments"); 
attachments.Action(nameof(AttachmentsController.UploadFile)) 
    .Returns<System.Net.Http.HttpResponseMessage>(); 

上記の文の重要な部分は、あなたのEdmModelに正しく戻り値の型を宣言しない場合、あなたはあなたのエンドポイントが戻っています、戻り値の型である必要があります406エラー - メソッドが正しく実行されたにもかかわらず、受け入れられません。最初に実行したときには本当に混乱します。これは、ODataが依然としてレスポンスの解析を試みてから、レスポンスを完了する前にリクエストのAcceptヘッダーに一致させるためです。このアプローチで

Try to use 'nameof' when mapping functions and actions instead of 'magic strings' or constants so that the compiler can pickup basic issues like wrongly defined route.

あなたはメソッドのヘッダにルート属性を必要としないとアクションは、メタデータドキュメントので、闊歩出力に含まれます。

関連する問題