2

ASP.NET Web API への呼び出しから、クライアント (ASP.NET MVC アプリケーション) でこのエラーが発生します。確認したところ、Web API は問題なくデータを返しています。

No MediaTypeFormatter is available to read an object of type 
'IEnumerable`1' from content with media type 'text/plain'.

HTTPDataContractSerializerヘッダーを.Content-Typetext/xml

しかし、私の質問は次のとおりです。それは必要ですか?

もしそうなら、デフォルトでDataContractSerializerはこの重要なヘッダーが設定されていないことを意味するからです。マイクロソフトは、そんな重要なことを省いていいのだろうかと思っていました。別の方法はありますか?

関連するクライアント側のコードは次のとおりです。

public ActionResult Index()
        {
            HttpClient client = new HttpClient();

            var response = client.GetAsync("http://localhost:55333/api/bookreview/index").Result;

            if (response.IsSuccessStatusCode)
            {
                IEnumerable<BookReview> reviews = response.Content.ReadAsAsync<IEnumerable<BookReview>>().Result;
                return View(reviews);
            }
            else
            {
                ModelState.AddModelError("", string.Format("Reason: {0}", response.ReasonPhrase));
                return View();
            }
        }

サーバー側 (Web API) のコードは次のとおりです。

public class BookReviewController : ApiController
    {
        [HttpGet]
        public IEnumerable<BookReview> Index()
        {
            try
            {
                using (var context = new BookReviewEntities())
                {
                    context.ContextOptions.ProxyCreationEnabled = false;

                    return context.BookReviews.Include("Book.Author");
                }
            }
            catch (Exception ex)
            {
                var responseMessage = new HttpResponseMessage
                {
                    Content = new StringContent("Couldn't retrieve the list of book reviews."),
                    ReasonPhrase = ex.Message.Replace('\n', ' ')
                };

                throw new HttpResponseException(responseMessage);
            }
        }
    }
4

2 に答える 2

4

に渡す responseMessage にステータス コードを明示的に設定する必要があると思います (今はテストする時間がないため) HttpResponseException。通常、HttpResponseExceptionはステータス コードを設定しますが、応答メッセージを明示的に提供しているため、そのステータス コードを使用します。デフォルトでは、`HttpResponseMessage のステータス コードは 200 です。

サーバーでエラーが発生しているのに、まだ 200 が返されています。そのため、クライアントは、StringContent によって生成されたテキスト/プレーン ボディを IEnumerable であるかのように逆シリアル化しようとしています。

設定する必要があります

responseMessage.StatusCode = HttpStatusCode.InternalServerError

サーバー上の例外ハンドラーで。

于 2013-01-10T19:43:10.120 に答える
1

ReadAsStringAsyncWebAPIがコンテンツをプレーンテキストで返すことを期待している場合に使用するのはどうですか?

response.Content.ReadAsStringAsync().Result;
于 2013-01-10T17:43:15.537 に答える