web-dev-qa-db-ja.com

「不正なContent-Type:」exception throws angular mvc 6 application

angularサービスでasp.net、mvc6、angularjsを使用してアプリケーションを開発しています。アクションメソッドにリクエストを送信すると、渡されたデータがありません。リクエストを確認すると、次の原因による例外が表示される場合があります。

  • フォーム '((Microsoft.AspNet.Http.Internal.DefaultHttpRequest)this.Request).Form'は、タイプ 'System.InvalidOperationException'の例外をスローしましたMicrosoft.AspNet.Http.IFormCollection {System.InvalidOperationException}

"Incorrect Content-Type:application/json;charset=UTF-8"という例外メッセージ

my angular service

return $http({ method: 'POST', url: 'home/createEvent', eventDetails: event })
                .success(function(data, status, headers, config) {
                    return data;
                })
                .catch(function(data, status, headers, config) {
                    console.log(data);
                });

私のコントローラーで

[HttpPost]
public IActionResult CreateEvent([FromBody]Event eventDetails)
{
    return Json(new {dsd=""},
        new JsonSerializerSettings {ContractResolver = new CamelCasePropertyNamesContractResolver()});

}
20
Gayan

次の例がお役に立てば幸いです。

コントローラーを飾ってみてください

[Produces("application/json")]
[Route("api/[controller]")]

コントローラー名を表示しなかったので、架空の完全な実例を示します。

コントローラ

[Produces("application/json")]
[Route("api/[controller]")]    
public class DashBoardLayoutApi : Controller
{
    public DashBoardLayoutApi()
    { }

    [HttpPost]
    public void Post([FromBody] LoginViewModel data)
    { }
}

C#ビューモデル

public class LoginViewModel
{
    public string Email { get; set; }
    public string Password { get; set; }
}

HTML/JS

<script>
    var data = {
        Email: 'Test',
        Password: 'Test',
        RememberMe: true
    };

    $("#test").click(function() {
        $.ajax({
            url: '/api/DashBoardLayoutApi',
            type: 'POST',
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify(data),                   
        });
    }
</script>
<button id="test"> Save Layout</button>

結果

enter image description hereenter image description here

6
hidden

受け入れられた答えは私にはうまくいきませんでした。私にとっての解決策は、$ http呼び出しにヘッダーを追加することでした。

        $http({
                url: "/install",
                method: "POST",
                data: data,
                headers: {
                    "Content-Type": "application/x-www-form-urlencoded"
                }
            })
            .success(...);
4
dave thieben

私の場合、[Produces("application/json")]を追加しても何もしませんでしたが、[FromBody]属性の属性は、トリックをしたものです!

0
adam0101

隠された答えは素晴らしいです。ただし、アプリケーションに非表示のアプローチを実装した後でも、C#コントローラーには空のモデルがありました。少し掘り下げてみると、問題はJSコードで作成された不正なクライアントモデルにあり、サーバーでデシリアライズできません(nullをGuid型に変換することはできません)。

何らかの理由で、このような場合、モデルバインダーは例外をスローしません。 https://docs.Microsoft.com/en-us/aspnet/core/mvc/models/model-binding

パラメーターがバインドされると、モデルバインドはその名前の値の検索を停止し、次のパラメーターのバインドに進みます。バインドが失敗した場合、MVCはエラーをスローしません。 ModelState.IsValidプロパティを確認することにより、モデル状態エラーを照会できます。

したがって、C#コントローラーのModelState.IsValidプロパティをチェックして、有効なモデルに合格したことを確認し、カスタムモデルバインダーを使用してモデルバインディングエラーをキャッチしてログに記録することを検討してください。

0
Keymatic