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-verwerking URI's spelen een centrale rol bij het ontwerpen 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 veel soorten gegevens, naast SOAP-berichten. Het WCF WEB HTTP-programmeermodel maakt gebruik van de WebHttpBinding en WebHttpBehavior ter ondersteuning van 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-ondersteuningvoor meer informatie over AJAX- en JSON-services. Zie WCF Syndication Overviewvoor 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 UriTemplate-queryreeksparameters en -URL's 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
Voorzichtigheid
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 Security Overviewvoor 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 WebDavvoor 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 variabel segment aan in plaats van een letterlijke waarde.
.NET Framework biedt een API voor het werken met URI-sjablonen met de naam UriTemplate.
UriTemplates
helpt u het volgende te 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
Match
() aanroepen 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 delen van de URI bevat die zijn gelabeld volgens de variabelen in de sjabloon.Bind
() enMatch
() zijn inverses, zodat uMatch
(Bind
( x ) kunt aanroepen en terugkeren met dezelfde omgeving waarmee u bent begonnen.
Er zijn veel momenten (met name op de server, waar het verzenden van een verzoek naar een service-operatie op basis van de URI noodzakelijk is) dat u een set UriTemplate-objecten wilt bijhouden in een gegevensstructuur die elke ingesloten sjabloon onafhankelijk kan adresseren. 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 om servicebewerkingen te koppelen 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 UriTemplateTablevoor 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. Met de WebGetAttribute en de WebInvokeAttribute kunt u bepalen hoe afzonderlijke bewerkingen worden gebonden aan URI's en de HTTP-methoden die aan deze URI's zijn gekoppeld. Voeg bijvoorbeeld WebGetAttribute en WebInvokeAttribute toe aan de volgende code.
[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 heeft als standaard POST, maar u kunt het ook gebruiken voor andere methoden.
[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 );
}
Zie How to: Create a Basic WCF Web HTTP Servicevoor een volledig voorbeeld van een WCF-service die gebruikmaakt van het WCF WEB HTTP-programmeermodel van WCF.
URI-sjabloon 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 | Formaat |
---|---|
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 (exponentnotatie is niet nodig) |
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] Dag Maand Jaar Maand Dag Jaar HH:MM:SS [AM|PM] |
TimeSpan | DD.HH:MM:SS Where DD = Days, HH = Hours, MM = minutes, SS = Seconds |
Guid | Een GUID, bijvoorbeeld: 936DA01F-9ABD-4d9d-80C7-02AF85C822A8 |
DateTimeOffset | DD/MM/JJJJ UU: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 met een TypeConverterAttribute waarmee het type kan worden omgezet naar en vanuit een tekenreeks. |
Afhankelijk van de typeconverter. |
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 kan de WebHttpBinding de 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 basis van Stream.
.NET Framework 3.5 biedt ondersteuning voor JSON-gegevens (AJAX) en syndicatiefeeds (inclusief ATOM en RSS). Zie WCF Web HTTP Format, WCF Syndication Overviewen AJAX Integration and JSON Supportvoor 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 IISvoor meer informatie over het instellen van SSL met IIS 7.0.
Problemen met het WCF WEB HTTP-programmeermodel oplossen
Wanneer u WCF WEB HTTP-services aanroept met behulp van een ChannelFactoryBase<TChannel> om een kanaal te maken, gebruikt de WebHttpBehavior de EndpointAddress ingesteld in het configuratiebestand, zelfs als een andere EndpointAddress wordt doorgegeven aan de ChannelFactoryBase<TChannel>.