كيف يمكنني الحصول على واجهة برمجة تطبيقات ASP.NET Web لإرجاع JSON بدلاً من XML باستخدام Chrome؟




google-chrome asp.net-web-api (24)

ما عليك سوى تغيير App_Start/WebApiConfig.cs مثل هذا:

public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();
        //Below formatter is used for returning the Json result.
        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
        //Default route
        config.Routes.MapHttpRoute(
           name: "ApiControllerOnly",
           routeTemplate: "api/{controller}"
       );
    }

باستخدام واجهة برمجة تطبيقات الويب ASP.NET الأحدث ، أرى في Chrome XML - كيف يمكنني تغييره لطلب JSON حتى أتمكن من مشاهدته في المتصفح؟ أعتقد أنها مجرد جزء من رؤوس الطلبات ، هل يمكنني تصحيح ذلك؟


يتم إعادة التنسيق الصحيح بواسطة مُنسق نوع الوسائط. كما ذكر آخرون ، يمكنك القيام بذلك في فئة 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"));

        ...
    }
}

لمزيد من المعلومات ، راجع:

في حالة قيام الإجراءات الخاصة بك بإرجاع XML (وهو الحالة افتراضيًا) وتحتاج فقط إلى طريقة معينة لإرجاع JSON ، يمكنك عندئذٍ استخدام 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] بدلاً من [JsonOutputAttribute] .


وفقًا لأحدث إصدار من ASP.net WebApi 2 ،

ضمن WebApiConfig.cs ، سيعمل هذا

config.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
config.Formatters.Add(GlobalConfiguration.Configuration.Formatters.JsonFormatter);

يمكنك استخدام على النحو التالي:

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

نظرًا لأن السؤال يتعلق بـ Chrome تحديدًا ، يمكنك الحصول على ملحق Postman الذي يسمح لك بتعيين نوع محتوى الطلب.


WebApiConfig هو المكان الذي يمكنك من خلاله تكوين ما إذا كنت تريد الإخراج في json أو xml. افتراضيا هو XML. في وظيفة التسجيل يمكننا استخدام HttpConfiguration Formatters لتنسيق الإخراج. System.Net.Http.Headers => MediaTypeHeaderValue ("text / html") يتطلب الحصول على الإخراج بتنسيق json.


ما عليك سوى إضافة هذين السطرين من الشفرة على صف WebApiConfig

public static class WebApiConfig
{
     public static void Register(HttpConfiguration config)
     {
          //add this two line 
          config.Formatters.Clear();
          config.Formatters.Add(new JsonMediaTypeFormatter());


          ............................
      }
}

هنا هو حل مماثل ل jayson.centeno's والإجابات الأخرى ، ولكن باستخدام تمديد المضمنة من System.Net.Http.Formatting .

public static void Register(HttpConfiguration config)
{
    // add support for the 'format' query param
    // cref: http://blogs.msdn.com/b/hongyes/archive/2012/09/02/support-format-in-asp-net-web-api.aspx
    config.Formatters.JsonFormatter.AddQueryStringMapping("$format", "json", "application/json");
    config.Formatters.XmlFormatter.AddQueryStringMapping("$format", "xml", "application/xml");

    // ... additional configuration
 }

تم توجيه الحل بشكل أساسي لدعم تنسيق $ OData في الإصدارات المبكرة من WebApi ، ولكنه ينطبق أيضًا على تنفيذ غير OData ، ويعرض Content-Type: application/json; charset=utf-8 Content-Type: application/json; charset=utf-8 header في الاستجابة.

يسمح لك &$format=json أو &$format=xml إلى نهاية uri الخاص بك عند الاختبار باستخدام متصفح. لا يتداخل مع السلوك المتوقع الآخر عند استخدام عميل غير متصفح حيث يمكنك تعيين الرؤوس الخاصة بك.


في Global.asax أنا أستخدم الرمز أدناه. My URI to get JSON is http://www.digantakumar.com/api/values?json=true

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

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

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new  QueryStringMapping("json", "true", "application/json"));
}

في WebApiConfig.cs ، أضف إلى نهاية وظيفة التسجيل :

// Remove the XML formatter
config.Formatters.Remove(config.Formatters.XmlFormatter);

Source .


إلقاء نظرة على تفاوض المحتوى في WebAPI. توضح هذه ( الجزء 1 والجزء 2 ) تدوينات مفصلة وشاملة رائعة كيف يعمل.

باختصار ، أنت على حق ، وتحتاج فقط إلى تعيين رؤوس الطلبات " Accept أو Content-Type . نظرًا لعدم تشفير الإجراء الخاص بك لإرجاع تنسيق محدد ، يمكنك تعيين Accept: application/json .


MVC4 سريع تلميح # 3 - إزالة XML منسق من ASP.Net Web API

في Global.asax أضف السطر:

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

مثل ذلك:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    BundleTable.Bundles.RegisterTemplateBundles();
    GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
}

إليك الطريقة الأسهل التي استخدمتها في تطبيقاتي. أضف ما يلي 3 أسطر من الكود في App_Start\\WebApiConfig.cs في وظيفة Register

    var formatters = GlobalConfiguration.Configuration.Formatters;

    formatters.Remove(formatters.XmlFormatter);

    config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));

ستقوم واجهة برمجة تطبيقات الويب Asp.net تلقائيًا بتسلسل الكائن العائدين إلى JSON ومع إضافة application/json في الرأس حتى يفهم المتصفح أو جهاز الاستقبال أنك تعرض نتيجة JSON.


خيار واحد سريع هو استخدام التخصص MediaTypeMapping. هذا مثال على استخدام QueryStringMapping في الحدث Application_Start:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("a", "b", "application/json"));

الآن عندما يحتوي عنوان url على querystring؟ a = b في هذه الحالة ، سيتم عرض استجابة Json في المستعرض.


باستخدام إجابة فيليب ليوسين لسنوات ، بعد التحديث الأخير للمكتبات الأساسية و Json.Net ، صادفت نظام System.MissingMethodException : SupportedMediaTypes. الحل في حالتي ، نأمل أن يكون مفيدًا للآخرين الذين يواجهون نفس الاستثناء غير المتوقع ، هو تثبيت System.Net.Http . NuGet على ما يبدو يزيلها في بعض الظروف. بعد التثبيت اليدوي ، تم حل المشكلة.


لقد وجدت تطبيق Chrome "Advanced REST Client" ممتازًا للعمل مع خدمات REST. يمكنك تعيين نوع المحتوى application/json بين أشياء أخرى: عميل REST المتقدم


معظم الإجابات المذكورة أعلاه منطقية تمامًا. نظرًا لأنك تشاهد بيانات يتم تنسيقها بتنسيق XML ، فذلك يعني أنه قد تم تطبيق تنسيق XML ، لذا يمكنك رؤية تنسيق JSON فقط من خلال إزالة XMLFormatter من معلمة HttpConfiguration مثل

public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );                
            config.Formatters.Remove(config.Formatters.XmlFormatter);                
            config.EnableSystemDiagnosticsTracing();
        }

نظرًا لأن JSON هو التنسيق الافتراضي


أحب أسلوب فيليب ليوسن الأفضل - تأكد من حصول المتصفحات على JSON دون المساومة على تفاوض المحتوى من العملاء الذين يريدون XML بالفعل. كانت القطعة المفقودة بالنسبة لي هي أن رؤوس الردود ما زالت تحتوي على نوع المحتوى: text / html. لماذا كانت هذه مشكلة؟ نظرًا لأنني أستخدم إضافة JSON Formatter على Chrome ، والتي تتفحص نوع المحتوى ، ولا أحصل على التنسيق الرائع الذي اعتدت عليه. أصلحت ذلك باستخدام مُنسق مخصص بسيط يقبل طلبات text / html ويعرض ردود التطبيق / json:

public class BrowserJsonFormatter : JsonMediaTypeFormatter
{
    public BrowserJsonFormatter() {
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        this.SerializerSettings.Formatting = Formatting.Indented;
    }

    public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType) {
        base.SetDefaultContentHeaders(type, headers, mediaType);
        headers.ContentType = new MediaTypeHeaderValue("application/json");
    }
}

تسجيل مثل ذلك:

config.Formatters.Add(new BrowserJsonFormatter());

يجعل هذا الرمز json الافتراضي الخاص بي ويسمح لي باستخدام تنسيق XML أيضًا. سأقوم فقط بإلحاق xml=true .

GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("xml", "true", "application/xml"));
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

شكرا لكم جميعا!


إذا قمت بذلك في WebApiConfig ، WebApiConfig على JSON افتراضيًا ، ولكنها ستظل تسمح لك بإرجاع XML إذا قمت بتمرير text/xml مثل الطلب Accept header

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
    }
}

إذا لم تكن تستخدم نوع مشروع MVC وبالتالي لم يكن لديك هذا الفصل للبدء به ، فراجع هذه الإجابة للحصول على تفاصيل حول كيفية دمجها.


يعمل استخدام RequestHeaderMapping بشكل أفضل ، لأنه يقوم أيضًا بتعيين Content-Type = application / json في عنوان الاستجابة ، والذي يسمح لـ Firefox (مع إضافة JSONView) بتنسيق الاستجابة كـ JSON.

GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings
.Add(new System.Net.Http.Formatting.RequestHeaderMapping("Accept", 
                              "text/html",
                              StringComparison.InvariantCultureIgnoreCase,
                              true, 
                              "application/json"));

استخدمت فلتر إجراءً عامًا لإزالة Accept: application/xml عندما يحتوي رأس User-Agent على "Chrome":

internal class RemoveXmlForGoogleChromeFilter : IActionFilter
{
    public bool AllowMultiple
    {
        get { return false; }
    }

    public async Task<HttpResponseMessage> ExecuteActionFilterAsync(
        HttpActionContext actionContext,
        CancellationToken cancellationToken,
        Func<Task<HttpResponseMessage>> continuation)
    {
        var userAgent = actionContext.Request.Headers.UserAgent.ToString();
        if (userAgent.Contains("Chrome"))
        {
            var acceptHeaders = actionContext.Request.Headers.Accept;
            var header =
                acceptHeaders.SingleOrDefault(
                    x => x.MediaType.Contains("application/xml"));
            acceptHeaders.Remove(header);
        }

        return await continuation();
    }
}

يبدو أنه يعمل.


أنا فقط إضافة ما يلي في فئة App_Start / WebApiConfig.cs في مشروع MVC Web API.

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

يضمن ذلك الحصول على json في معظم طلبات البحث ، ولكن يمكنك الحصول على xml عند إرسال text/xml .

إذا كنت بحاجة إلى الحصول على استجابة Content-Type application/json يرجى التحقق من إجابة Todd أدناه .

يستخدم System.Net.Http.Headers ؛


لا تستخدم متصفحك لاختبار API الخاص بك.

بدلاً من ذلك ، حاول استخدام عميل HTTP الذي يسمح لك بتحديد طلبك ، مثل CURL ، أو حتى Fiddler.

تكمن المشكلة في هذه المشكلة في العميل ، وليس في واجهة برمجة التطبيقات. تتصرف واجهة برمجة تطبيقات الويب بشكل صحيح ، وفقًا لطلب المتصفح.





asp.net-web-api