1220 Stimmen

Wie bringe ich ASP.NET Web API dazu, JSON anstelle von XML mit Chrome zurückzugeben?

Die Verwendung der neueren ASP.NET Web API , in Chrom Ich sehe XML - wie kann ich es in eine Anfrage ändern? JSON damit ich sie im Browser anzeigen kann? Ich glaube, es ist nur ein Teil der Anfrage-Header, bin ich damit richtig?

6voto

mdisibio Punkte 2818

Hier ist eine ähnliche Lösung wie jayson.centeno's und andere Antworten, aber mit der eingebauten Erweiterung von 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
 }

Die Lösung war in erster Linie auf die Unterstützung von $format für OData in den frühen Versionen von WebApi ausgerichtet, aber sie gilt auch für die Nicht-OData-Implementierung und gibt die Content-Type: application/json; charset=utf-8 Header in der Antwort.

Es ermöglicht Ihnen, die &$format=json o &$format=xml an das Ende der uri anhängen, wenn Sie mit einem Browser testen. Dies beeinträchtigt nicht das erwartete Verhalten bei der Verwendung eines Nicht-Browser-Clients, in dem Sie Ihre eigenen Header setzen können.

6voto

Md. Sabbir Ahamed Punkte 375

Fügen Sie einfach diese beiden Codezeilen in Ihre WebApiConfig Klasse

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

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

4voto

vaheeds Punkte 2016

Sie ändern einfach die App_Start/WebApiConfig.cs wie diese:

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

3voto

rism Punkte 11523

Es ist zwar schon einige Zeit her, dass diese Frage gestellt (und beantwortet) wurde, aber eine andere Möglichkeit besteht darin, den Accept-Header auf dem Server während der Verarbeitung der Anfrage mit einem MessageHandler wie unten beschrieben zu überschreiben:

public class ForceableContentTypeDelegationHandler : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(
                HttpRequestMessage request,
                CancellationToken cancellationToken)
    {
        var someOtherCondition = false;
        var accHeader = request.Headers.GetValues("Accept").FirstOrDefault();
        if (someOtherCondition && accHeader.Contains("application/xml"))
        {
            request.Headers.Remove("Accept");
            request.Headers.Add("Accept", "application/json");
        }
        return await base.SendAsync(request, cancellationToken);
    }
}

どこで someOtherCondition kann alles sein, einschließlich Browsertyp usw. Dies wäre für bedingte Fälle, in denen wir nur manchmal die Standard-Inhaltsaushandlung außer Kraft setzen wollen. Andernfalls, wie in anderen Antworten, würden Sie einfach einen unnötigen Formatierer aus der Konfiguration entfernen.

Sie müssen es natürlich registrieren. Sie können dies entweder global tun:

  public static void Register(HttpConfiguration config) {
      config.MessageHandlers.Add(new ForceableContentTypeDelegationHandler());
  }

oder für jede einzelne Strecke:

config.Routes.MapHttpRoute(
   name: "SpecialContentRoute",
   routeTemplate: "api/someUrlThatNeedsSpecialTreatment/{id}",
   defaults: new { controller = "SpecialTreatment" id = RouteParameter.Optional },
   constraints: null,
   handler: new ForceableContentTypeDelegationHandler()
);

Da es sich um einen Message-Handler handelt, wird er sowohl auf der Anfrage- als auch auf der Antwortseite der Pipeline ausgeführt, ähnlich wie ein HttpModule . So können Sie die Überschreibung leicht mit einer benutzerdefinierten Kopfzeile bestätigen:

public class ForceableContentTypeDelegationHandler : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(
                HttpRequestMessage request,
                CancellationToken cancellationToken)
    {
        var wasForced = false;
        var someOtherCondition = false;
        var accHeader = request.Headers.GetValues("Accept").FirstOrDefault();
        if (someOtherCondition && accHeader.Contains("application/xml"))
        {
            request.Headers.Remove("Accept");
            request.Headers.Add("Accept", "application/json");
            wasForced = true;
        }

        var response =  await base.SendAsync(request, cancellationToken);
        if (wasForced){
          response.Headers.Add("X-ForcedContent", "We overrode your content prefs, sorry");
        }
        return response;
    }
}

3voto

Vikas Bansal Punkte 9514

Hier ist die einfachste Methode, die ich in meinen Bewerbungen verwendet habe. Fügen Sie die unten angegebenen 3 Codezeilen in App_Start\WebApiConfig.cs im Register Funktion:

var formatters = GlobalConfiguration.Configuration.Formatters;

formatters.Remove(formatters.XmlFormatter);

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

Asp.net Web API serialisiert Ihr zurückkehrendes Objekt automatisch zu JSON und als die application/json wird in der Kopfzeile hinzugefügt, damit der Browser oder der Empfänger versteht, dass Sie ein JSON-Ergebnis zurückgeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X