2017-03-26 11 views
2

フロントエンドでは、Angularを使用してフォームからsomデータを収集し、それをサーバー側コントローラに送信します。画像が下に示すように、私はコントローラとサービスでデータ($ scope.newData)を取得しますが、サーバに到達すると、「サポートされていないメディアタイプ」とnewDataが空です。サポートされていないメディアタイプASP.NETコアWeb API

Website console

マイコントローラ:

// Create new salesman 
    $scope.addSalesman = function (newData) { 
    console.log("Controller"); 
    console.log($scope.newData); 
    myService.addNewSalesman($scope.newData).then(function (data) { 
     console.log(data); 
    }, function (err) { 
     console.log(err); 
    }); 
    }; 

マイサービス:

addNewSalesman: function (newData) { 
      console.log("service"); 
      console.log(newData) 
      var deferred = $q.defer(); 
      $http({ 
       method: 'POST', 
       url: '/api/Salesman', 
       headers: { 'Content-type': 'application/json' } 
      }, newData).then(function (res) { 
       deferred.resolve(res.data); 
      }, function (res) { 
       deferred.reject(res); 
      }); 
      return deferred.promise; 
     } 

私のセールスマンモデル:

public class Salesman 
    { 
     public int SalesmanID { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Gender { get; set; } 
     public string BirthDate { get; set; } 
     public int Phone { get; set; } 
     public string Adress { get; set; } 
     public string City { get; set; } 
     public int Postal { get; set; } 
     public string Role { get; set; } 
    } 

私のサーバー側コントローラ:

[Route("api/[controller]")] 
public class SalesmanController : Controller 
{ 

    private readonly DataAccess _DataAccess; 

    public SalesmanController() 
    { 
     _DataAccess = new DataAccess(); 
    } 

    [HttpPost] 
    public IActionResult PostSalesman([FromBody] Salesman newData) 
    { 
     return Ok(newData); 
    } 
+0

角度サービスが正しいヘッダーを送信し、JSONペイロードを送信していることがわかりますか? – MindingData

+0

要素を検査し、ネットワークの下をチェックする場合。これは私がそれを見ることができる場所です。 – Fillah

+0

リクエストペイロード+ヘッダーを表示するようお願いしています:) – MindingData

答えて

4

送信しているヘッダーが間違っています。 Content-Type: application/jsonを送信していますが、Accept: application/jsonを送信する必要があります。

Content-Type: application/jsonは、サーバーがクライアントに送信する必要があります。クライアントは、受け入れる応答の種類をサーバーに伝えるために、Acceptを送信する必要があります。

addNewSalesman: function (newData) { 
     console.log("service"); 
     console.log(newData) 
     var deferred = $q.defer(); 
     $http({ 
      method: 'POST', 
      url: '/api/Salesman', 
      headers: { 'Accept': 'application/json' } 
     }, newData).then(function (res) { 
      deferred.resolve(res.data); 
     }, function (res) { 
      deferred.reject(res); 
     }); 
     return deferred.promise; 
    } 

する必要があります。 MDNの "Content negotiation"も参照してください。

+0

私はまだ同じエラーが発生しています:( – Fillah

+0

jsonがmvcのボックスから登録されており、xmlのみを別々に登録する必要があるので、それは奇妙です。正常なデフォルト値があります – Tseng

+0

これは面白いことですが、実際にはヘッダーを付けずに動作するか、まったく受け入れないからです。 – Fillah

4

これはCORSの問題です。

開発中、すべてのHTTP要求メソッドをすべての起点から受け入れることは安全です。あなたのstartup.csに以下を追加します。

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     //Accept All HTTP Request Methods from all origins 
     app.UseCors(builder => 
      builder.AllowAnyHeader().AllowAnyOrigin().AllowAnyMethod()); 

     app.UseMvc(); 
    } 

は、CORSの詳細についてはhereを参照してください。

+0

これは正解です! –

+1

その場合、実稼働環境のソリューションは何ですか? –

+0

prod envでは、 -CorsPolicyBuilderクラスを使用してCORSミドルウェアを追加する場合のCORPポリシーCORSポリシーは実際にAPIに許可されている起源の「ホワイトリスト」です。詳細はこちら[link] https://docs.microsoft.com/ja -us/aspnet/core/security/cors#set-the-allowed-origins –

関連する問題