asp.net-mvc - जेएसओएन हमेशा वापस करने के लिए एएसपी.नेट वेब एपीआई को कैसे मजबूर करें?




asp.net-web-api (8)

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

दिमित्री को क्रेडिट

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

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


फिलिप डब्ल्यू का सही जवाब था, लेकिन स्पष्टता और पूर्ण कार्य समाधान के लिए, इस तरह दिखने के लिए अपनी Global.asax.cs फ़ाइल को संपादित करें: (नोटिस मुझे संदर्भ जेनरेट फ़ाइल में 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());
        }
    }
}

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

यह एक्सएमएल फॉर्मेटर को साफ़ करता है और इस प्रकार जेएसओएन प्रारूप में डिफॉल्ट करता है।


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

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

इसमें सही हेडर सेट हैं। थोड़ा और सुरुचिपूर्ण लगता है।

public JsonResult<string> TestMethod() 
{
return Json("your string or object");
}

एएसपी.नेट वेब एपीआई में केवल जेएसओएन का समर्थन - सही रास्ता

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

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

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

संपादित करें

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


सही प्रारूप को वापस करना मीडिया-प्रकार फॉर्मेटर द्वारा किया जाता है। जैसा कि अन्य ने उल्लेख किया है, आप इसे WebApiConfig कक्षा में कर सकते हैं:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ...

        // Configure Web API to return JSON
        config.Formatters.JsonFormatter
        .SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));

        ...
    }
}

अधिक के लिए, जांचें:

यदि आपके कार्य एक्सएमएल लौटा रहे हैं (जो डिफ़ॉल्ट रूप से मामला है) और आपको जेएसओएन वापस करने के लिए केवल एक विशिष्ट विधि की आवश्यकता है, तो आप एक ActionFilterAttribute उपयोग कर सकते हैं और इसे उस विशिष्ट क्रिया पर लागू कर सकते हैं।

फ़िल्टर विशेषता:

public class JsonOutputAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        ObjectContent content = actionExecutedContext.Response.Content as ObjectContent;
        var value = content.Value;
        Type targetType = actionExecutedContext.Response.Content.GetType().GetGenericArguments()[0];

        var httpResponseMsg = new HttpResponseMessage
        {
            StatusCode = HttpStatusCode.OK,
            RequestMessage = actionExecutedContext.Request,
            Content = new ObjectContent(targetType, value, new JsonMediaTypeFormatter(), (string)null)
        };

        actionExecutedContext.Response = httpResponseMsg;
        base.OnActionExecuted(actionExecutedContext);
    }
}

कार्रवाई करने के लिए आवेदन कर रहा है:

[JsonOutput]
public IEnumerable<Person> GetPersons()
{
    return _repository.AllPersons(); // the returned output will be in JSON
}

ध्यान दें कि आप क्रिया सजावट पर Attribute शब्द को छोड़ सकते हैं और [JsonOutput] बजाय बस [JsonOutput] उपयोग कर सकते हैं।





asp.net-mvc asp.net-web-api