So arbeiten Sie mit der Inhaltsverhandlung in der Web-API

Die ASP.Net-Web-API ist ein kompaktes Framework zum Erstellen zustandsloser und RESTful-HTTP-Dienste. RESTful-Services sind leichte, zustandslose, Client-Server-basierte, zwischenspeicherbare Services, die auf dem Konzept der Ressourcen basieren. REST ist ein Architekturstil - eine Reihe von Einschränkungen, die zum Implementieren zustandsloser Dienste verwendet werden. Es ist ein Architekturparadigma, mit dem wiederverwendbare, skalierbare Dienste erstellt werden.

Die Darstellung einer Ressource in dem gewünschten Format ist ein interessantes Thema, da Sie Ihre Dienste häufig von verschiedenen Gerätetypen nutzen möchten. Die Aushandlung von Inhalten ist eines der wichtigsten Konzepte in der Web-API. Obwohl dies ein relativ einfaches Konzept ist, gibt es viele Missverständnisse und Missverständnisse rund um dieses Thema. Wenn Sie RESTful-Services mithilfe der Web-API entwerfen und implementieren, müssen Sie sich häufig mit der Aushandlung von Inhalten befassen.

Was ist ausgehandelter Inhalt und warum ist er wichtig?

Die Inhaltsverhandlung kann als der Prozess zum Überprüfen der Struktur einer eingehenden HTTP-Anforderung definiert werden, um die beste Darstellung einer Ressource aus mehreren verfügbaren Darstellungen derselben Ressource zu ermitteln. Im Wesentlichen handelt es sich bei der Inhaltsverhandlung um ein Konzept, mit dem dieselbe URL denselben Inhalt in verschiedenen Formaten bereitstellen kann. Sie können die Inhaltsverhandlung nutzen, um den bevorzugten Medientyp auszuwählen.

In der Web-API wird die Inhaltsaushandlung von der Laufzeit (auf der Serverseite) durchgeführt, um den Medientypformatierer zu bestimmen, der verwendet werden soll, um die Antwort auf eine eingehende Anforderung von der Clientseite zurückzugeben.

Die Inhaltsverhandlung konzentriert sich auf den Medientyp und den Medientypformatierer. Während sich Ersteres auf den Wert des Headers "Inhaltstyp" in der HTTP-Anforderung und der HTTP-Antwort bezieht, wird Letzteres verwendet, um .NET-Typen in entsprechende HTTP-Daten zu konvertieren und umgekehrt. Beachten Sie, dass der Medientypformatierer in der Web-API durch eine abstrakte Klasse namens MediaTypeFormatter dargestellt wird.

Das Web-API-Framework enthält standardmäßig die folgenden Formatierer.

  • System.Net.Http.Formatting.JsonMediaTypeFormatter
  • System.Net.Http.Formatting.XmlMediaTypeFormatter
  • System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
  • System.Web.Http.ModelBinding.JQueryMvcFormUrlEncodedFormatter

Um die Inhaltsaushandlung in der Web-API anzupassen, ist die Zuordnung des Medientyps der wichtigste Erweiterungspunkt, den Sie nutzen müssten. Beachten Sie, dass die Web-API standardmäßig die folgenden Zuordnungen von Medientypen enthält.

  • QueryStringMapping
  • UriPathExtensionMapping
  • RequestHeaderMapping
  • MediaRangeMapping

Um eine benutzerdefinierte Medientypzuordnung zu erstellen, müssen Sie eine Klasse erstellen, die die MediaTypeMapping erweitert, wie im folgenden Codeausschnitt gezeigt.

public class MediaTypeMapping : MediaTypeMapping

{

   protected override double OnTryMatchMediaType(HttpResponseMessage response)

     {

                //Write your custom code here

     }

}

Das folgende Codefragment zeigt, wie Sie die Namen aller unterstützten Formatierer in der Web-API abrufen können, indem Sie die Auflistung HttpConfiguration.Formatters iterieren.

   [HttpGet]

       public List GetAllFormatters()

       {

           List lstFormaters = new List();

           foreach (var formatter in this.Configuration.Formatters)

           {

               lstFormaters.Add(formatter.GetType().Name);

           }

           return lstFormaters;

       }

Lassen Sie uns nun untersuchen, wie wir mit der Inhaltsverhandlung arbeiten können, um den gewünschten Formatierer auszuwählen und den Inhalt in dem von uns benötigten Format abzurufen. Betrachten Sie die folgende Entitätsklasse.

public class CustomerDTO

   {

       public Int32 Id

       { get; set; }

       public string FirstName

       { get; set; }

       public string LastName

       { get; set; }

       public string Address

      { get; set; }

   }

Angenommen, Sie haben eine Methode, mit der Daten in eine Liste vom Typ CustomerDTO eingefügt und zurückgegeben werden.

private List GetCustomerData()

       {

           List lstCustomers = new List();

           CustomerDTO customer = new CustomerDTO();

           customer.Id = 1;

           customer.FirstName = "Joydip";

           customer.LastName = "Kanjilal";

           customer.Address = "Hyderabad, India";

           lstCustomers.Add(customer);

           return lstCustomers;

       }

Die folgende Web-API-Methode zeigt, wie Sie HttpResponseMessage als Antwort von Ihrer Web-API-Methode basierend auf dem verfügbaren Standardmechanismus für die Inhaltsaushandlung zurückgeben können.

[HttpGet]

       public HttpResponseMessage GetCustomers()

       {

           List lstCustomers = GetCustomerData();

           IContentNegotiator negotiator = Configuration.Services.GetContentNegotiator();

           ContentNegotiationResult result = negotiator.Negotiate(typeof(CustomerDTO), Request, Configuration.Formatters);

           return new HttpResponseMessage()

           {

               Content = new ObjectContent (lstCustomers, result.Formatter, result.MediaType.MediaType)

         };

       }

Wenn Sie einen bestimmten Formatierer verwenden, der in der Formatierungssammlung verfügbar ist, möchten Sie möglicherweise dieselbe Methode wie im folgenden Codeausschnitt neu schreiben.

[HttpGet]

       public HttpResponseMessage GetCustomers()

       {

           List lstCustomers = GetCustomerData();

           return new HttpResponseMessage()

           {

               Content = new ObjectContent (lstCustomers, Configuration.Formatters[1])

           };

      }

In Ordnung; Aber wie erstellen Sie dann Ihren eigenen Formatierer? Um einen benutzerdefinierten Formatierer für Medientypen zu erstellen, sollten Sie eine Klasse erstellen, die die abstrakte Klasse MediaTypeFormatter erweitert. Anschließend sollten Sie Ihren benutzerdefinierten Code in die von Ihnen erstellte Klasse schreiben, um die Methoden der abstrakten Basisklasse MediaTypeFormatter zu überschreiben.

public class CustomMediaTypeFormatter : MediaTypeFormatter

   {

       public override bool CanReadType(Type type)

       {

           throw new NotImplementedException();

       }

       public override bool CanWriteType(Type type)

       {

           throw new NotImplementedException();

       }

   }

Sobald Ihr benutzerdefinierter Formatierer eingerichtet ist, können Sie ihn einfach zur Formatierungssammlung hinzufügen:

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