2017-12-06 15 views
2

を経由してフォームデータを返しません。ASP.Net WEBAPIそれはバグだ場合、私は知らないが、私は、サーバー側の生の要求を取得することができませんよコンテンツ

は、コントローラのメソッドを次の点を考慮

[AllowAnonymous] 
[Route("api/sayHello")] 
[HttpPost] 
public string SayHello([FromBody] string userName) 
{ 
    return $"Hello, {userName}."; 
} 

私はカールを経由してそれを呼び出す:

curl -X POST 'https://localhost:809/api/sayHello' --insecure -d "=userName" 

それは正常に動作します。 enter image description here

今、私はいくつかのログを追加しようとしています。私は、次のことを行っているグローバルフィルタを追加:

public async Task LogFilterAction(HttpActionContext context) 
{ 
    if (context == null) 
     throw new ArgumentNullException(nameof(context)); 
    LogFilterAction(context.ActionDescriptor?.ControllerDescriptor?.ControllerType, 
     context.ActionDescriptor?.ActionName, 
     context.Request?.RequestUri, 
     await GetDataAsString(context.Request?.Content), 
     context.Response?.StatusCode 
    ); 
} 

private static async Task<string> GetDataAsString(HttpContent content) 
{ 
    if (content == null) 
     return null; 
    var contentBytes = await content.ReadAsByteArrayAsync(); 
    return Encoding.UTF8.GetString(contentBytes); 
} 

をしかし、ここで問題です:不明な理由の理由contentBytesは常に空の配列です。私は、しかし、あなたが見ることができるように、ASP.Netが正常に引数を要求している

enter image description here

あるいは

enter image description here

それは実際の長さは9(=userName文字列のそれの長さ)であるということを参照しますそれは生の方法でそれを返しません。ストリームはposition = 0、contentConsumed = false、それ以外はすべて正常です。しかし、私できないは、コントローラに渡されたデータを読み取ります。

はここに何が悪いのでしょうか?あなたがコンテンツストリームにアクセスするときに、それが既に読み込まれていると、ストリームは、その端部に配置されるように

+0

あなたはそれを理解しましたか? – Evk

答えて

1

ASP.NETのWeb APIは、一度だけコンテンツを読み込みます。コンテンツを読み取る別の試みは何も返しません。

しかし、私はストリームをリセットして、もう一度それを読むことができた小さなサンプルで:

private async Task<string> GetDataAsString(HttpContent content) 
{ 
    if (content == null) 
     return null; 
    using (var str = await content.ReadAsStreamAsync()) 
    { 
     if (str.CanSeek) 
      str.Seek(0, System.IO.SeekOrigin.Begin); 
     using (var rdr = new StreamReader(str)) 
     { 
      return rdr.ReadToEnd(); 
     } 
    } 
} 

しかし、副作用を避けるために、あなたはのActionArgumentsプロパティを使用して検討する必要がありますActionContext。このプロパティを使用して、ロギングのアクションに渡される値を取得できます。これは、ASP.NET Web APIの内部配管に干渉しません。