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?

1832voto

Felipe Leusin Punkte 19815

Hinweis: Lesen Sie die Kommentare zu dieser Antwort. Es kann eine XSS-Schwachstelle entstehen, wenn Sie die Standardfehlerbehandlung von WebAPI verwenden.

Ich füge einfach folgendes ein App_Start / WebApiConfig.cs Klasse in meiner MVC Web-API Projekt.

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

Das stellt sicher, dass Sie bei den meisten Abfragen JSON erhalten, aber Sie können auch XML wenn Sie senden text/xml .

Wenn Sie die Antwort haben müssen Content-Type como application/json bitte prüfen Todd's Antwort unten .

NameSpace verwendet System.Net.Http.Headers .

522voto

Glenn Slaven Punkte 32691

Wenn Sie dies in der WebApiConfig erhalten Sie standardmäßig JSON, aber Sie können auch XML zurückgeben, wenn Sie text/xml wie die Anfrage Accept Kopfzeile.

Hinweis: Damit entfällt die Unterstützung für application/xml

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

Wenn Sie nicht den MVC-Projekttyp verwenden und daher diese Klasse nicht von Anfang an hatten, siehe diese Antwort um zu erfahren, wie Sie es einbinden können.

350voto

dmit77 Punkte 3510

Die Verwendung von RequestHeaderMapping funktioniert sogar noch besser, da es auch die Content-Type = application/json in der Kopfzeile der Antwort, was es Firefox (mit dem JSONView-Add-on) ermöglicht, die Antwort als JSON zu formatieren.

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

329voto

Todd Menier Punkte 34732

Ich mag Der Ansatz von Felipe Leusin Am besten ist es, dafür zu sorgen, dass die Browser JSON erhalten, ohne die Aushandlung von Inhalten durch Kunden zu beeinträchtigen, die eigentlich XML wollen. Das einzige, was mir fehlte, war, dass die Antwort-Header immer noch content-type: text/html enthielten. Warum war das ein Problem? Weil ich die JSON Formatter Chrome-Erweiterung die den Inhaltstyp überprüft, und ich bekomme nicht die schöne Formatierung, die ich gewohnt bin. Ich habe das mit einem einfachen benutzerdefinierten Formatierer behoben, der text/html-Anfragen annimmt und application/json-Antworten zurückgibt:

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

Registrieren Sie sich wie folgt:

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

192voto

Yakir Manor Punkte 4509

MVC4-Kurztipp Nr. 3 - Entfernen des XML-Formatierers aus ASP.Net Web API

Unter Global.asax die Zeile hinzufügen:

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

etwa so:

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

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

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

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