2012-09-27 9 views
91

ASP.NET Web APIはデフォルトでコンテンツネゴシエーションを行います。Acceptヘッダーに基づいてXMLまたはJSONまたはその他の型を返します。私は必要ない/これを望んで、JSONを常に返すようにWeb APIに指示する方法(属性など)がありますか?ASP.NET Web APIを強制的にJSONを返すようにするには?

+0

あなたは 'GlobalConfiguration.Configuration.Formatters' –

答えて

66

Supporting only JSON in ASP.NET Web API – THE RIGHT WAY

JsonContentNegotiatorでIContentNegotiatorを置き換えます

var jsonFormatter = new JsonMediaTypeFormatter(); 
//optional: set serializer settings here 
config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter)); 

JsonContentNegotiator実装:

public class JsonContentNegotiator : IContentNegotiator 
{ 
    private readonly JsonMediaTypeFormatter _jsonFormatter; 

    public JsonContentNegotiator(JsonMediaTypeFormatter formatter) 
    { 
     _jsonFormatter = formatter;  
    } 

    public ContentNegotiationResult Negotiate(
      Type type, 
      HttpRequestMessage request, 
      IEnumerable<MediaTypeFormatter> formatters) 
    { 
     return new ContentNegotiationResult(
      _jsonFormatter, 
      new MediaTypeHeaderValue("application/json")); 
    } 
} 
+3

コードの最初の部分はどこで切り取られ貼り付けられますか?私はGlobal.asaxに "config"オブジェクトが表示されません。その変数はどこから来ていますか?記事では説明しません。 – BuddyJoe

+2

プロジェクトの作成時にVS2012によって生成されたWebApiConfig.csファイルのpublic static void Register(HttpConfiguration config){...}メソッド –

+0

これは、クライアントのAccept XMLがJSONを取得するという意味でJSONを強制しますか? **は406を取得しません**? –

145

すべてのフォーマッタをクリアし、Jsonフォーマッタを元に戻します。

GlobalConfiguration.Configuration.Formatters.Clear(); 
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter()); 

EDIT

私はApplication_Start()内部Global.asaxにこれを追加しました。

+0

、ファイル内からJSONを除くすべてのフォーマッタを取り外し、これを行うことができるかもしれません...? global.ascx .. ?? – shashwat

+0

Application_Start()メソッドで – Jafin

+6

フィリップWが今より良い方法を得ました:)、こちらをご覧くださいhttp://www.strathweb.com/2013/06/supporting-only-json-in-asp-net-web-api -the-right-way/ –

2

あなたが唯一の方法のためにそれを行うにしたい場合は、代わりにHttpResponseMessageを返すように、あなたのメソッドを宣言IEnumerable<Whatever>としてください:

public HttpResponseMessage GetAllWhatever() 
    { 
     return Request.CreateResponse(HttpStatusCode.OK, new List<Whatever>(), Configuration.Formatters.JsonFormatter); 
    } 

このコードはユニットテストのための痛みですが、それはまた、このようなことが可能です:

ドミトリーパブロフの優秀な答えに触発さ
sut = new WhateverController() { Configuration = new HttpConfiguration() }; 
    sut.Configuration.Formatters.Add(new Mock<JsonMediaTypeFormatter>().Object); 
    sut.Request = new HttpRequestMessage(); 
+0

メソッドのために何かしたい場合は、http://msdn.microsoft.com/en-us/library/system.web.mvc.actionfilterattribute(v=vs.118).aspxを作成するだけです。 – Elisabeth

1

私はプラグインのことができるように、私は強制したいものは何でもフォーマッタ、私は少しそれを変更しました。

ドミトリーにクレジットします。

/// <summary> 
/// A ContentNegotiator implementation that does not negotiate. Inspired by the film Taken. 
/// </summary> 
internal sealed class LiamNeesonContentNegotiator : IContentNegotiator 
{ 
    private readonly MediaTypeFormatter _formatter; 
    private readonly string _mimeTypeId; 

    public LiamNeesonContentNegotiator(MediaTypeFormatter formatter, string mimeTypeId) 
    { 
     if (formatter == null) 
      throw new ArgumentNullException("formatter"); 

     if (String.IsNullOrWhiteSpace(mimeTypeId)) 
      throw new ArgumentException("Mime type identifier string is null or whitespace."); 

     _formatter = formatter; 
     _mimeTypeId = mimeTypeId.Trim(); 
    } 

    public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters) 
    { 
     return new ContentNegotiationResult(_formatter, new MediaTypeHeaderValue(_mimeTypeId)); 
    } 
} 
10

フィリップ・Wは次のように見えるようにあなたのGlobal.asax.csファイルを編集し、正しい答えを持っていたが、明快かつ完全な作業溶液について:(Iが基準System.Net.Http.Formattingを追加する必要がありました注意してください

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net.Http.Formatting; 
using System.Web; 
using System.Web.Http; 
using System.Web.Mvc; 
using System.Web.Optimization; 
using System.Web.Routing; 

namespace BoomInteractive.TrainerCentral.Server { 
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801 

    public class WebApiApplication : System.Web.HttpApplication { 
     protected void Application_Start() { 
      AreaRegistration.RegisterAllAreas(); 

      WebApiConfig.Register(GlobalConfiguration.Configuration); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 

      //Force JSON responses on all requests 
      GlobalConfiguration.Configuration.Formatters.Clear(); 
      GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter()); 
     } 
    } 
} 
6
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); 

)株式生成されたファイルにこれはXMLフォーマッタので、JSON形式をデフォルトをクリアします。

+0

すべてが必要です – tfa

0

ヨWebApiConfig.csに使用することができます。

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 
0

これが設定され、正しいヘッダを持っています。もう少しエレガントに見えます。

public JsonResult<string> TestMethod() 
{ 
return Json("your string or object"); 
} 
関連する問題