web-dev-qa-db-ja.com

入力は有効な.Net Core Web APIではありませんでした

私は奇妙な問題に直面しており、ほぼ4時間を運なしで過ごしました。

フォーム送信時に呼び出す単純なWeb APIがあります。

API-

// POST: api/Tool
[HttpPost]
public void Post([FromBody] Object value)
{
    _toolService.CreateToolDetail(Convert.ToString(value));
}

HTML-

<!DOCTYPE html>
<html>
<body>

<h2>HTML Forms</h2>
<form name="value" action="https://localhost:44352/api/tool" method="post">
  First name:<br>
  <input type="text" id="PropertyA" name="PropertyA" value="Some value A">
  <br>
  Last name:<br>
  <input type="text" id="PropertyB" name="PropertyB" value="Some value B">
  <br><br>
  <!--<input type="file" id="Files" name="Files" multiple="multiple"/>-->
  <br><br>
  <input type="submit" value="Submit">

  </form>
</body>
</html>

送信ボタンを押すと、以下のエラーが表示されます-

{"":["The input was not valid."]}

スタートアップクラスの構成

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    services.AddSingleton<IConfiguration>(Configuration);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseMvc();
}

これは、POSTリクエストでのみ発生します。 GETリクエストは正常に機能します。 Postman RESTクライアントでテストするときの同じ問題。助けてください?詳細を提供できるかどうか教えてください。

25
Souvik Ghosh

FromBodyを使用しないでください。 x-www-form-urlencoded(つまり、標準のHTMLフォームポスト)として送信しています。 FromBody属性はJSON/XML用です。

両方の標準フォーム送信を処理することはできませんおよび同じアクションからのJSON/XML要求本文。両方の方法でアクションを要求する必要がある場合は、2つの別個のエンドポイントが必要になります。1つはFromBodyで装飾されたパラメーターを使用し、もう1つは使用しません。他の方法はありません。アクションの実際の機能は、コードの重複を減らすために、両方のアクションが利用できるプライベートメソッドに含めることができます。

32
Chris Pratt

私はここで同様の状況を経験しました。問題なく[FromBody]を使用できました。

public class MyController : Controller
{
   [HttpPost]
   public async Task<IActionResult> SomeEndpoint([FromBody]Payload inPayload)
   {
   ...
   }
}

public class Payload
{
   public string SomeString { get; set; }
   public int SomeInt { get; set; }
}

私が考え出した課題は、「application/json」として設定されたContent-Typeヘッダーを使用して要求が行われていることを確認することでした。 Postmanを使用して、元の要求が「入力が無効でした」として返されました。 Content-Typeヘッダーを追加すると、問題が修正されました。

11
Adam Schumph

MjwillsとDavidGが言ったように、おそらくコントローラーパラメーターの実装には次のような具体的なクラスを使用する必要があります。

public class MyClass
{
    public string PropertyA { get; set; }

    public string PropertyB { get; set; }
}
0
Ben Krueger

ブラウザのネットワークタブを調べると、フォームが入力値をパラメーターとしてURLに送信しており、itselfではなく、URLに送信していることがわかります。そのため、名前をvalueに設定しても、「value」というプロパティはサーバーに送信されません。

代わりに、postメソッドはvalueと呼ばれるプロパティを期待しています。これは任意のタイプ(オブジェクトであるため)であり、他のパラメータを受け取っているため、そのパラメータは満たされません。 PropertyBおよびファイル。

あなたの完全な投稿URLはおそらく今このようになっているはずです:

https:// localhost:44352/api/tool?PropertyA = X&PropertyB = Y&Files = Z

また、PostメソッドにURLを指定しなかったことにも注意してください。そのため、クライアントがどのように到達するかはわかりません/ api/Tool。おそらくコントローラーでそのURLを指定し、Route属性を追加する必要があります。

[Route( "api/tool")]

それ以外の場合、自然なルートはHostname/Controller/Methodまたは https:// localhost:44352/api/post です(コントローラーの名前がApiの場合)。それ以外の場合は、「api」をコントローラーの名前に置き換えます。

0
ShadowKras

私の解決策は属性ApiControllerを無効にしていたのと同じ問題がありますなぜあなたはこれを読むことができるのか分かりません[ https://docs.Microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore- 2.2#multipartform-data-request-inference] 私は何が問題なのか理解していない

[Produces("application/json")]
    [Route("api/[controller]")]
    //[ApiController]<<remove this
    public class PagosController : ControllerBase

あなたの方法

[HttpPost("UploadDescuento")]
public async Task<IActionResult> UploadDescuento(IEnumerable<IFormFile> files)

本文のテキストタイプを、たとえばテキストからJSON(アプリケーション)などの必要な形式に変更します。

0
tonderaimuchada