2017-05-22 14 views
0

Web APIで期待通りにPOSTコンテンツを取得できないという問題が発生しています。私は、以下の(フォーム1)のように見えるコントローラ内のルートを持つことができるはずチュートリアル後ASP.NET Web APIがPOST本体から読み取れない

[Route("my-post-method")] 
public HttpResponseMessage MyPostMethod(MyModel model) 
{ 
    Request.CreateResponse(HttpStatus.OK, model.SomeNumber * 5); 
} 

しかし、これは動作しません。代わりに、私は、次の(フォーム2)しなければならない:今

[Route("my-post-method")] 
public HttpResponseMessage MyPostMethod() 
{ 
    var text = new StreamReader(HttpContext.Current.Request.InputStream).ReadToEnd(); 
    var model = JsonConvert.DeserializeObject<MyModel>(text); 
    Request.CreateResponse(HttpStatusCode.OK, model.SomeNumber * 5); 
} 

を、私はこのプロジェクトにCORSの設定とは何かを持っているが、私はよく分からないを考える。私がPostman経由でフォーム1をリクエストしようとすると、すべてが意図どおりに機能します。ブラウザからフォーム1を要求してContent-Typeヘッダーを設定しないと、POSTリクエストでサポートされていないメディアタイプのエラーが発生します(これは私が期待していることです)。 Content-Typeヘッダーを "application/json"に設定すると、Web APIはOPTIONSプリフライトリクエストで404応答を返します。さらに、メソッド引数に[FromBody]属性を追加しても何も行われません。

Web.configファイルが含まれています

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Headers" value="Content-Type" /> 
     <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" /> 
     </customHeaders> 
    </httpProtocol> 
</system.webServer> 
をし、スタートアップコンフィギュレーションクラスがあります。

public static void Register(HttpConfiguration config) 
{ 
    config.EnableCors(); 
    config.MapHttpAttributeRoutes(); 

    var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First(); 
    jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
    jsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; 
    jsonFormatter.SerializerSettings.Formatting = Formatting.Indented; 
    jsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter()); 

    config.EnsureInitialized(); 
} 
+0

[FromBody](https://stackoverflow.com/questions/24625303/why-do-we-have-to-specify-frombody-and-fromuri-in-asp-net-web)を追加しないでください。 -api)属性? –

+0

あなたは*フォーム*について言及してから、* Json *について話しました。あなたは何をしようとしているのですか?また、ブラウザからこのモデルを投稿しようとしている様子も見せてください。 –

+0

また、[この理由](https://stackoverflow.com/a/36968863/3670737)の**同じアプリケーションで** CORSを2回有効にすることは決してありません。 'Web.config'の中でWeb Api ** OR **で有効にしてください。 –

答えて

0

あなたがここに

文書化されているように[EnableCors]属性であなたの方法を飾るために必要があるように見えます

https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api

郵便受けからの要請クライアント側のブラウザ要求のようなCORSは必要ありません。

+0

var corsConfig = new EnableCorsAttribute( "*"、 "Content-Type"、 "GET、POST、PUT、PATCH、DELETE、OPTIONS" ); config.EnableCors(corsConfig); を起動設定クラスに追加し、CORSの内容をweb.configから削除しました。それは問題を引き起こしていたweb.configのようなものでした。 – user1806676

関連する問題