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?
Antworten
Zu viele Anzeigen?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.
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}"
);
}
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;
}
}
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.