2017-09-01 11 views
0

私はAngularJSアプリケーションからのリクエストを処理する安らかなWebAPIアプリケーションを持っています。 GET動詞を必要とするコントローラーアクションは正常に動作しますが、コンテンツを返さないPOST/PUTのアクションはNullreference例外をスローします。WebAPIコントローラがバックグラウンドで例外をスローする

例:

[HttpPut] 
public void Update() 

これは私の関数実行戻った後、次のメッセージを表示します。

System.NullReferenceException: Object reference not set to an instance of an object. <SendAsync>d__0.MoveNext 

また、クライアントへのHTTPステータスコード204を返します。単にステータスコード200が動作しません復帰

[HttpPut] 
[Route("")] 
public async Task<object> Update(ProfileViewModel model) 
{ 
    _profileManager.Update(model); 

    return Ok(new {}); 
} 

注:非同期であると期待どおりに動作する空のオブジェクトを返すためにメソッドシグネチャを変更することにより

。一部のコンテンツも返される必要があります。そうでない場合は、例外がスローされます。

これは、DELETEを含むGETではないすべての要求で発生します。どのように私は署名を変更せずにすべての単一のメソッドの匿名オブジェクトを返すことなくこれを修正できますか?

+0

1.Pleaseは、あなたの更新方法の周りにあなたのコードのビットより多くを共有しています。 2.カスタムフォーマッター/モデルバインダーを使用していますか? – Gurpreet

+0

完全なUpdate()メソッドで質問を更新しましたが、わかりますように、それはあまり効果がありません。フォーマッタについて、はい - 私はカスタムJsonのシリアライズにフォーマッタを使用します。 –

+0

[NullReferenceExceptionとは何か、それを修正するにはどうすればいいですか?](https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) ) – Igor

答えて

1
  1. 任意の_profileManager.Update(モデル)せずにこのコードを試してみてください。
  2. .netコアを使用している場合は、IActionResultを使用します。
  3. 返さOk()は、何かを返すよう強制しておらず、うまくいくはずです。
  4. これが機能しない場合は、カスタムシリアライザのエラーをチェックしてください。
  5. もしあなたが_profileManager.Update(モデル)を戻して、それが何らかのエラーを投げていないかどうかを確認してください。

    [HttpPut] 
    [Route("")] 
    public async Task<IHttpActionResult> Update(ProfileViewModel model) 
    { 
        return Ok(); 
    } 
    
+0

ありがとう、私はこれを試し、結果であなたに戻ってくるよ。 –

+0

シリアライザの単体テストを試してください。 – Gurpreet

+0

Startupクラスのすべての設定ステートメントをコメントアウトした後、私はこの行がこの不正行為を作成したことを知りました: 'WebApiConfig.MessageHandlers.Insert(0、新しいServerCompressionHandler(新しいGZipCompressor()、新しいDeflateCompressor())); このパッケージは廃止されましたので、私は要求圧縮を処理するための別の解決策を見つけなければなりません。[パッケージリンク](https://www.nuget.org/packages/Microsoft.AspNet.WebApi.MessageHandlers.Compression/) ありがとう、@Gurpreet –

1

あなたは、オブジェクトを返す必要はありません。

[HttpPost] 
public IActionResult Update() 
{ 
    return Ok(); 
} 
+0

これは200応答を返しますが、とにかく例外がスローされます。 –

+2

このコードで例外が発生した場合、別の問題があります。 –

関連する問題