ASP.NET वेब एपीआई को हमेशा JSON पर वापस लाने के लिए कैसे मजबूर करें?


103

ASP.NET वेब एपीआई डिफ़ॉल्ट रूप से सामग्री बातचीत करता है - Acceptहेडर के आधार पर XML या JSON या अन्य प्रकार लौटाएगा । मुझे इसकी आवश्यकता नहीं है / यह नहीं चाहिए, क्या वेब एपीआई को हमेशा जेएसएन को वापस करने के लिए एक तरीका (एक विशेषता या कुछ की तरह) है?


आप यह करने में सक्षम हो सकते हैं कि सभी फॉर्मेटर्स को json को छोड़करGlobalConfiguration.Configuration.Formatters
क्लाउडियो रेडी सेप

जवाबों:


75

ASP.NET वेब एपीआई में केवल JSON का समर्थन - सही रास्ता

JontContentNegotiator के साथ 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"));
    }
}

4
कोड का पहला भाग कहाँ कट और चिपकाया जाता है? मुझे अपने Global.asax में "config" ऑब्जेक्ट दिखाई नहीं देता है। वह चर कहाँ से आ रहा है? लेख भी स्पष्ट नहीं करता है।
बडीजियो

3
सार्वजनिक स्थैतिक शून्य रजिस्टर (HttpConfiguration config) {...} विधि की जाँच करें WebApiConfig.cs फ़ाइल में जो प्रोजेक्ट निर्माण पर VS2012 द्वारा तैयार की गई है
दिमित्री पावलोव

क्या यह JSON को इस अर्थ में मजबूर करेगा कि एक ग्राहक AcceptXML को JSON प्राप्त करेगा, और उसे 406 नहीं मिलेगा ?
ल्यूक पुप्लेट

1
मैं अपनी टिप्पणी / प्रश्न का उत्तर दे सकता हूं: यह XML को Acceptहेडर जो भी देता है ।
ल्यूक पुप्लेट

2
इससे मेरा swashbuckle एकीकरण टूट जाता है और ऐसा लगता है कि यह इस मुद्दे पर github ( github.com/domaindrivendev/Swashbuckle/issues/219 ) से संबंधित है। मैं इस पद्धति का उपयोग करना चाहता हूं, लेकिन नीचे वाला GlobalConfiguration...Clear()वास्तव में काम करता है।
seangwright

167

सभी फ़ॉर्मेटर्स को साफ़ करें और Json फॉर्मैटर को वापस जोड़ें।

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

संपादित करें

मैंने उसे Global.asaxअंदर से जोड़ दिया Application_Start()


और किस फाइल में .. ?? global.ascx .. ??
शशवत

अपने Application_Start () विधि में
Jafin

6
फ़िलिप डब्ल्यू अभी बेहतर तरीके से मिला :), इसे यहाँ देखें strathweb.com/2013/06/…
टीएन डू

7
@TienDo - फिलिप के अपने ब्लॉग से लिंक करना?
फिल

10

फिलिप डब्ल्यू के पास सही जवाब था, लेकिन स्पष्टता और पूर्ण कार्य समाधान के लिए, इस तरह दिखने के लिए अपनी Global.asax.cs फ़ाइल को संपादित करें: (ध्यान दें कि मुझे संदर्भ System.Net.Http को जोड़ना होगा। स्टॉक जनरेट की गई फ़ाइल के लिए डाउनलोडिंग)

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());
        }
    }
}

9
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

यह XML फॉर्मेट को क्लियर करता है और इस तरह JSON फॉर्मेट को डिफॉल्ट करता है।


सही है कि सभी की जरूरत है
tfa

4

दिमित्री पावलोव के उत्कृष्ट उत्तर से प्रेरित होकर, मैंने इसे थोड़ा बदल दिया ताकि मैं जिस भी फॉर्मैटर को लागू करना चाहता हूं, उसमें प्लग-इन कर सकूं।

दिमित्री को श्रेय।

/// <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));
    }
}

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();

यदि आप किसी विधि के लिए कुछ चाहते हैं तो केवल msdn.microsoft.com/en-us/library/…
Elisabeth


0

Yo WebApiConfig.cs में उपयोग कर सकते हैं:

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

0

OWIN का उपयोग करने वालों के लिए

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

(Startup.cs में) हो जाता है:

   public void Configuration(IAppBuilder app)
        {
            OwinConfiguration = new HttpConfiguration();
            ConfigureOAuth(app);

            OwinConfiguration.Formatters.Clear();
            OwinConfiguration.Formatters.Add(new DynamicJsonMediaTypeFormatter());

            [...]
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.