2

Web サービスを ASP.NET Web Api 2 に移行していて、ほぼ最初のハードルで問題にぶつかっています。

私はこれをしたい:

public class SomeController : ApiController
{
    [Route("some\url")]
    public object Get()
    {
        return { Message = "Hello" };
    }
}

また、サービスに「application/json」または「application/xml」(または実際にはメッセージ パックなどのその他の潜在的な形式) を要求し、シリアル化された応答を取得できます。しかし、JSONでしか機能しないようです。

私はこれを読ん、フレームワークが匿名型の XML へのシリアル化を (真剣に) 処理できず、解決策は XML を (真剣に) 使用しないことであると明確に述べているドキュメントを見ました。

これを呼び出して XML を応答タイプとして要求しようとすると、

The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'.

XML を要求したいクライアントのサポートを削除するつもりはありませんが、これに対する回避策が本当に見つかりません。どうすればよいですか?

編集

これらを追加しました:

System.Web.Http.GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
config.Formatters.Insert(0, new System.Net.Http.Formatting.JsonMediaTypeFormatter());
config.Formatters.Insert(0, new System.Net.Http.Formatting.XmlMediaTypeFormatter());

Dalorzoの答えによると、違いはありませんでした.

明確にするために、 の受け入れヘッダーを使用してサービスを呼び出すと、サービスはまったく問題なく動作しますが、 の受け入れヘッダーを使用してapplication/json呼び出すと爆弾が発生しapplication/xmlます。

4

4 に答える 4

4

次の 3 つのオプションがあります。

  1. 適切な名前でクラスを作成し、匿名型の代わりにオブジェクトを返します。
  2. または、匿名インスタンスを返したい場合は、XML フォーマッターを削除する必要があります。これは、匿名型が XML フォーマッターでサポートされていないためです。

  3. MediaTypeFormatterまたはBufferedMediaTypeFormatterから継承する独自のフォーマッタを作成する

于 2014-05-19T21:36:16.493 に答える
2

次のコードでそれを行うことができます:

public HttpResponseMessage GetTestData()
        {        
               var testdata = (from u in context.TestRepository.Get().ToList()                            
                            select
                                 new Message
                                 {
                                     msgText = u.msgText                                    
                                 });    
                return ActionContext.Request.CreateResponse(HttpStatusCode.OK, testdata);
        }
于 2014-05-20T07:05:34.473 に答える
0

Chrome で API ルートを参照してください。デフォルトでは、Chrome は出力を XML 形式で表示します。そうでない場合は、サービスがメディア形式を使用した XML 形式を妨げていることを意味します。

その場合、WebApiConfig を検索する必要があります。そこに何も存在しない場合は、このファイルをプロジェクトに追加します

using System.Net.Http.Formatting;
using System.Collections.Generic;
using System.Net.Http;
using System;
using System.Linq;
using System.Net.Http.Headers;
namespace ExampleApp.Infrastructure
{
    public class CustomNegotiator : DefaultContentNegotiator
    {
        public override ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
        {
            if(request.Headers.UserAgent.Where(x=>x.Product!=null&& x.Product.Name.ToLower().Equals("chrome")).Count() > 0)
            {
                return new ContentNegotiationResult(new JsonMediaTypeFormatter(), new MediaTypeHeaderValue("application/xml"));
            }
            else
            {
                return base.Negotiate(type, request, formatters);
            }
        }
    }
}

に、WebApiConfig.cs次を追加します。

config.Services.Replace(typeof(IContentNegotiator), new CustomNegotiator());
于 2015-12-25T18:39:52.507 に答える