web-dev-qa-db-ja.com

`ReadAsAsync <string>`および `ReadAsStringAsync`は何に使用する必要がありますか?

どうしたら良い HttpContentExtensions.ReadAsAsync<string>およびHttpContent.ReadAsStringAsyncに使用されますか?

彼らは同じようなことをしているように見えますが、奇妙な方法で機能します。いくつかのテストとその出力を以下に示します。場合によってはJsonReaderExceptionがスローされ、場合によってはJSONが出力されますが、追加のエスケープ文字が含まれます。

私はコードベース全体で両方の関数を使用することになりましたが、それらがどのように機能するはずであるかを理解できれば、どちらかを調整することを望んでいました。

//Create data and serialise to JSON
var data = new
{
    message = "hello world"
};
string dataAsJson = JsonConvert.SerializeObject(data);

//Create request with data
HttpConfiguration config = new HttpConfiguration();
HttpRequestMessage request = new HttpRequestMessage();
request.SetConfiguration(config);
request.Method = HttpMethod.Post;
request.Content = new StringContent(dataAsJson, Encoding.UTF8, "application/json");

string requestContentT = request.Content.ReadAsAsync<string>().Result; // -> JsonReaderException: Error reading string.Unexpected token: StartObject.Path '', line 1, position 1.
string requestContentS = request.Content.ReadAsStringAsync().Result; // -> "{\"message\":\"hello world\"}"

//Create response from request with same data
HttpResponseMessage responseFromRequest = request.CreateResponse(HttpStatusCode.OK, dataAsJson, "application/json");

string responseFromRequestContentT = responseFromRequest.Content.ReadAsAsync<string>().Result; // -> "{\"message\":\"hello world\"}"
string responseFromRequestContentS = responseFromRequest.Content.ReadAsStringAsync().Result; // -> "\"{\\\"message\\\":\\\"hello world\\\"}\""

//Create a standalone new response
HttpResponseMessage responseNew = new HttpResponseMessage();
responseNew.Content = new StringContent(dataAsJson, Encoding.UTF8, "application/json");

string responseNewContentT = responseNew.Content.ReadAsAsync<string>().Result; // -> JsonReaderException: Error reading string.Unexpected token: StartObject.Path '', line 1, position 1.
string responseNewContentS = responseNew.Content.ReadAsStringAsync().Result; // -> "{\"message\":\"hello world\"}"
10
James Wood

ReadAsStringAsync :これは基本的な「コンテンツを文字列として取得する」方法です。それは単なる文字列なので、投げたものすべてに働きます。

ReadAsAsync<T> :これは、JSON応答をオブジェクトに逆シリアル化するために使用されることを意図しています。失敗する理由は、返されるJSONが単一の文字列の有効なJSON表現ではないためです。たとえば、文字列をシリアル化する場合:

var result = JsonConvert.SerializeObject("hello world");
Console.WriteLine(result);

出力は次のとおりです。

"hello world"

二重引用符で囲まれていることに注意してください。任意のJSONを"....."の形式ではない文字列に直接逆シリアル化しようとすると、JSONが"で始まることが期待されるため、表示される例外がスローされます。

9
DavidG