Overzicht van WCF-web-HTTP-programmeermodel
Het WCF-WEB HTTP-programmeermodel (Windows Communication Foundation) biedt de basiselementen die nodig zijn voor het bouwen van WEB HTTP-services met WCF. WCF WEB HTTP-services zijn ontworpen voor toegang tot de breedste reeks mogelijke clients, waaronder webbrowsers en hebben de volgende unieke vereisten:
URI's en URI-verwerkings-URI's spelen een centrale rol in het ontwerp van WEB HTTP-services. Het WCF WEB HTTP-programmeermodel maakt gebruik van de UriTemplate en UriTemplateTable klassen om URI-verwerkingsmogelijkheden te bieden.
Ondersteuning voor GET- en POST-bewerkingen WEB HTTP-services maken gebruik van het GET-werkwoord voor het ophalen van gegevens, naast verschillende aanroepende werkwoorden voor het wijzigen van gegevens en externe aanroepen. Het WCF WEB HTTP-programmeermodel maakt gebruik van de WebGetAttribute en WebInvokeAttribute om servicebewerkingen te koppelen aan zowel GET als andere HTTP-werkwoorden, zoals PUT, POST en DELETE.
Meerdere gegevensindelingen webservices verwerken naast SOAP-berichten allerlei soorten gegevens. Het WCF WEB HTTP-programmeermodel maakt gebruik van en WebHttpBindingWebHttpBehavior ondersteunt veel verschillende gegevensindelingen, waaronder XML-documenten, JSON-gegevensobjecten en streams van binaire inhoud, zoals afbeeldingen, videobestanden of tekst zonder opmaak.
Het WCF WEB HTTP-programmeermodel breidt het bereik van WCF uit om webscenario's te behandelen die WEB HTTP-services, AJAX- en JSON-services en syndicatiefeeds (ATOM/RSS) omvatten. Zie AJAX-integratie en JSON-ondersteuning voor meer informatie over AJAX- en JSON-services. Zie WCF Syndication Overview voor meer informatie over Syndication.
Er zijn geen extra beperkingen voor de typen gegevens die kunnen worden geretourneerd vanuit een WEB HTTP-service. Elk serialiseerbaar type kan worden geretourneerd vanuit een WEB HTTP-servicebewerking. Omdat WEB HTTP-servicebewerkingen kunnen worden aangeroepen door een webbrowser, is er een beperking voor welke gegevenstypen in een URL kunnen worden opgegeven. Zie de sectie Parameters en URL's van de UriTemplate-queryreeks hieronder voor meer informatie over welke typen standaard worden ondersteund. Het standaardgedrag kan worden gewijzigd door uw eigen T:System.ServiceModel.Dispatcher.QueryStringConverter-implementatie op te geven die aangeeft hoe de parameters die zijn opgegeven in een URL moeten worden geconverteerd naar het werkelijke parametertype. Zie QueryStringConverter voor meer informatie
Let op
Services die zijn geschreven met het WCF WEB HTTP-programmeermodel gebruiken geen SOAP-berichten. Omdat SOAP niet wordt gebruikt, kunnen de beveiligingsfuncties van WCF niet worden gebruikt. U kunt echter transportgebaseerde beveiliging gebruiken door uw service te hosten met HTTPS. Zie Overzicht van beveiliging voor meer informatie over WCF-beveiliging
Waarschuwing
Het installeren van de WebDAV-extensie voor IIS kan ertoe leiden dat web-HTTP-services een HTTP 405-fout retourneren wanneer de WebDAV-extensie probeert alle PUT-aanvragen te verwerken. U kunt dit probleem omzeilen door de WebDAV-extensie te verwijderen of de WebDAV-extensie voor uw website uit te schakelen. Zie IIS en WebDav voor meer informatie
URI-verwerking met UriTemplate en UriTemplateTable
URI-sjablonen bieden een efficiƫnte syntaxis voor het uitdrukken van grote sets met structureel vergelijkbare URI's. Met de volgende sjabloon wordt bijvoorbeeld de set van alle drie de segment-URI's weergegeven die beginnen met 'a' en eindigen op 'c' zonder rekening te houden met de waarde van het tussenliggende segment: a/{segment}/c
In deze sjabloon worden URI's als volgt beschreven:
a/x/c
a/y/c
a/z/c
enzovoort.
In deze sjabloon geeft de accolade notatie ({segment}) een variabele segment aan in plaats van een letterlijke waarde.
.NET Framework biedt een API voor het werken met URI-sjablonen met de naam UriTemplate. UriTemplates
hiermee kunt u het volgende doen:
U kunt een van de
Bind
methoden aanroepen met een set parameters om een volledig gesloten URI te produceren die overeenkomt met de sjabloon. Dit betekent dat alle variabelen in de URI-sjabloon worden vervangen door werkelijke waarden.U kunt () aanroepen
Match
met een kandidaat-URI, die een sjabloon gebruikt om een kandidaat-URI op te splitsen in de samenstellende onderdelen en een woordenlijst retourneert die de verschillende onderdelen van de URI bevat die zijn gelabeld volgens de variabelen in de sjabloon.Bind
() enMatch
() zijn inverses, zodat u (Bind
x) kunt aanroepenMatch
en terugkeren met dezelfde omgeving waarmee u bent begonnen.
Er zijn vaak (met name op de server, waarbij het verzenden van een aanvraag naar een servicebewerking op basis van de URI nodig is) die u wilt bijhouden van UriTemplate een set objecten in een gegevensstructuur die elk van de ingesloten sjablonen onafhankelijk kan aanpakken. UriTemplateTable vertegenwoordigt een set URI-sjablonen en selecteert de beste overeenkomst op basis van een set sjablonen en een kandidaat-URI. Dit is niet gekoppeld aan een bepaalde netwerkstack (WCF inbegrepen), zodat u deze waar nodig kunt gebruiken.
Het WCF-servicemodel maakt gebruik van UriTemplate en UriTemplateTable koppelt servicebewerkingen aan een set URI's die worden beschreven door een UriTemplate. Een servicebewerking is gekoppeld aan een UriTemplate, met behulp van de WebGetAttribute of de WebInvokeAttribute. Zie UriTemplate en UriTemplateTable voor meer informatie over UriTemplate en UriTemplateTable
WebGet- en WebInvoke-kenmerken
WCF WEB HTTP-services maken gebruik van het ophalen van werkwoorden (bijvoorbeeld HTTP GET) naast verschillende aanroepende werkwoorden (bijvoorbeeld HTTP POST, PUT en DELETE). Met het WCF WEB HTTP-programmeermodel kunnen serviceontwikkelaars de URI-sjabloon en het werkwoord beheren dat is gekoppeld aan hun servicebewerkingen met de WebGetAttribute en WebInvokeAttribute. WebInvokeAttribute Hiermee WebGetAttribute kunt u bepalen hoe afzonderlijke bewerkingen worden gebonden aan URI's en de HTTP-methoden die aan deze URI's zijn gekoppeld. Voeg bijvoorbeeld de volgende code toe WebGetAttribute en WebInvokeAttribute voeg deze toe.
[ServiceContract]
interface ICustomer
{
//"View It"
[WebGet]
Customer GetCustomer():
//"Do It"
[WebInvoke]
Customer UpdateCustomerName( string id,
string newName );
}
Met de voorgaande code kunt u de volgende HTTP-aanvragen indienen.
GET /GetCustomer
POST /UpdateCustomerName
WebInvokeAttribute standaard ingesteld op POST, maar u kunt deze ook gebruiken voor andere werkwoorden.
[ServiceContract]
interface ICustomer
{
//"View It" -> HTTP GET
[WebGet( UriTemplate="customers/{id}" )]
Customer GetCustomer( string id ):
//"Do It" -> HTTP PUT
[WebInvoke( UriTemplate="customers/{id}", Method="PUT" )]
Customer UpdateCustomer( string id, Customer newCustomer );
}
Als u een volledig voorbeeld wilt zien van een WCF-service die gebruikmaakt van het WCF WEB HTTP-programmeermodel, raadpleegt u: Een eenvoudige WCF-web-HTTP-service maken
UriTemplate-queryreeksparameters en -URL's
Webservices kunnen worden aangeroepen vanuit een webbrowser door een URL te typen die is gekoppeld aan een servicebewerking. Deze servicebewerkingen kunnen queryreeksparameters gebruiken die moeten worden opgegeven in een tekenreeksformulier binnen de URL. In de volgende tabel ziet u de typen die kunnen worden doorgegeven binnen een URL en de gebruikte indeling.
Type | Indeling |
---|---|
Byte | 0 - 255 |
SByte | -128 - 127 |
Int16 | -32768 - 32767 |
Int32 | -2,147,483,648 - 2,147,483,647 |
Int64 | -9.223.372.036.854.775.808 - 9.223.372.036.854.775.807 |
UInt16 | 0 - 65535 |
UInt32 | 0 - 4,294,967,295 |
UInt64 | 0 - 18,446,744,073,709,551,615 |
Single | -3.402823e38 - 3.402823e38 (exponent notatie is niet vereist) |
Double | -1.79769313486232e308 - 1.79769313486232e308 (exponent notatie is niet vereist) |
Char | Een willekeurig teken |
Decimal | Een decimaalteken in standaard notatie (geen exponent) |
Boolean | Waar of Onwaar (niet hoofdlettergevoelig) |
String | Een tekenreeks (null-tekenreeks wordt niet ondersteund en er wordt geen escape uitgevoerd) |
DateTime | MM/DD/JJJJ MM/DD/JJJJ UU:MM:SS [AM|PM] Maanddagjaar Maanddag jaar UU:MM:SS [AM|PM] |
TimeSpan | DD.UU:MM:SS Where DD = Days, HH = Hours, MM = minutes, SS = Seconds |
Guid | Een GUID, bijvoorbeeld: 936DA01F-9ABD-4d9d-80C7-02AF85C822A8 |
DateTimeOffset | MM/DD/JJJJ UU:MM:SS MM:SS MM:SS Where DD = Days, HH = Hours, MM = minutes, SS = Seconds |
Opsommingen | De opsommingswaarde bijvoorbeeld, waarmee de opsomming wordt gedefinieerd, zoals wordt weergegeven in de volgende code.public enum Days{ Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; Een van de afzonderlijke opsommingswaarden (of de bijbehorende gehele getallen) kan worden opgegeven in de querytekenreeks. |
Typen die een TypeConverterAttribute type hebben dat het type kan converteren naar en van een tekenreeksweergave. |
Afhankelijk van het type conversieprogramma. |
Indelingen en het WCF WEB HTTP-programmeermodel
Het WCF WEB HTTP-programmeermodel heeft nieuwe functies om te werken met veel verschillende gegevensindelingen. Op de bindingslaag kunnen de WebHttpBinding volgende verschillende soorten gegevens lezen en schrijven:
XML
JSON
Ondoorzichtige binaire streams
Dit betekent dat het WCF WEB HTTP-programmeermodel elk type gegevens kan verwerken, maar u kunt programmeren op Streambasis van .
.NET Framework 3.5 biedt ondersteuning voor JSON-gegevens (AJAX) en syndicatiefeeds (inclusief ATOM en RSS). Zie WCF Web HTTP-opmaak, WCF Syndication Overview en AJAX Integration and JSON Support voor meer informatie over deze functies.
WCF WEB HTTP-programmeermodel en -beveiliging
Omdat het WCF WEB HTTP-programmeermodel de WS-*-protocollen niet ondersteunt, is de enige manier om een WCF WEB HTTP-service te beveiligen de service beschikbaar te maken via HTTPS via SSL. Zie SSL implementeren in IIS voor meer informatie over het instellen van SSL met IIS 7.0.
Problemen met het WCF WEB HTTP-programmeermodel oplossen
Bij het aanroepen van WCF WEB HTTP-services met behulp van een ChannelFactoryBase<TChannel> om een kanaal te maken, wordt de WebHttpBehaviorEndpointAddress set in het configuratiebestand gebruikt, zelfs als een andere EndpointAddress wordt doorgegeven aan de ChannelFactoryBase<TChannel>.