Omówienie modelu programowania HTTP w sieci Web w programie WCF
Model programowania HTTP sieci Web programu Windows Communication Foundation (WCF) zawiera podstawowe elementy wymagane do tworzenia internetowych usług HTTP za pomocą programu WCF. Usługi HTTP sieci Web WCF są przeznaczone do uzyskiwania dostępu przez najszerszą gamę możliwych klientów, w tym przeglądarek internetowych i mają następujące unikatowe wymagania:
Identyfikatory URI i ich przetwarzanie pełnią kluczową rolę w projektowaniu usług HTTP w sieci Web. Model programowania HTTP sieci Web WCF używa klas UriTemplate i UriTemplateTable w celu zapewnienia możliwości przetwarzania identyfikatora URI.
Obsługa operacji GET i POST internetowych usług HTTP korzystają z czasownika GET do pobierania danych, oprócz różnych czasowników wywołania na potrzeby modyfikacji danych i wywołania zdalnego. Model programowania WWW HTTP modelu WCF używa WebGetAttribute i WebInvokeAttribute do kojarzenia operacji usługi zarówno z poleceniami GET, jak i innymi czasownikami HTTP, takimi jak PUT, POST i DELETE.
Wiele formatów danych usługi w stylu sieci Web przetwarzają wiele rodzajów danych oprócz komunikatów PROTOKOŁU SOAP. Model programowania HTTP sieci Web WCF używa WebHttpBinding i WebHttpBehavior do obsługi wielu różnych formatów danych, w tym dokumentów XML, obiektu danych JSON i strumieni zawartości binarnej, takich jak obrazy, pliki wideo lub zwykły tekst.
Model programowania HTTP sieci Web WCF rozszerza zasięg usługi WCF, aby uwzględnić scenariusze w stylu sieci Web, które obejmują usługi WEB HTTP, usługi AJAX i JSON oraz źródła danych Syndication (ATOM/RSS). Aby uzyskać więcej informacji na temat usług AJAX i JSON, zobacz integracja AJAX i obsługa formatu JSON. Aby uzyskać więcej informacji na temat syndykacji, zobacz Omówienie syndykacji WCF.
Nie ma dodatkowych ograniczeń dotyczących typów danych, które mogą być zwracane z usługi HTTP sieci Web. Dowolny typ serializowalny można zwrócić z operacji usługi sieciowej HTTP. Ponieważ operacje usługi HTTP sieci Web mogą być wywoływane przez przeglądarkę internetową, istnieje ograniczenie dotyczące typów danych, które można określić w adresie URL. Aby uzyskać więcej informacji na temat typów obsługiwanych domyślnie, zobacz sekcję Parametry ciągu zapytania i adresy URL UriTemplate poniżej. Zachowanie domyślne można zmienić, podając własną implementację T:System.ServiceModel.Dispatcher.QueryStringConverter, która określa sposób konwertowania parametrów określonych w adresie URL na rzeczywisty typ parametru. Aby uzyskać więcej informacji, zobacz QueryStringConverter
Ostrożność
Usługi napisane za pomocą modelu programowania HTTP sieci Web WCF nie używają komunikatów PROTOKOŁU SOAP. Ponieważ protokół SOAP nie jest używany, nie można używać funkcji zabezpieczeń udostępnianych przez usługę WCF. Można jednak używać zabezpieczeń opartych na transporcie, hostując usługę przy użyciu protokołu HTTPS. Aby uzyskać więcej informacji na temat zabezpieczeń WCF, zobacz Security Overview.
Ostrzeżenie
Zainstalowanie rozszerzenia WebDAV dla usług IIS może spowodować, że usługi HTTP sieci Web zwracają błąd HTTP 405, ponieważ rozszerzenie WebDAV próbuje obsłużyć wszystkie żądania PUT. Aby obejść ten problem, możesz odinstalować rozszerzenie WebDAV lub wyłączyć rozszerzenie WebDAV dla witryny sieci Web. Aby uzyskać więcej informacji, zobacz IIS i WebDav.
Przetwarzanie identyfikatora URI za pomocą UriTemplate i UriTemplateTable
Szablony URI zapewniają wydajną składnię do wyrażania dużych zestawów strukturalnie podobnych URI. Na przykład poniższy szablon wyraża zbiór wszystkich trzysegmentowych identyfikatorów URI, które zaczynają się od "a" i kończą na "c", bez względu na wartość segmentu pośredniego: a/{segment}/c
W tym szablonie opisano identyfikatory URI, takie jak następujące:
a/x/c
a/y/c
a/z/c
i tak dalej.
W tym szablonie notacja nawiasu klamrowego ("{segment}") wskazuje zmienny segment zamiast wartości literału.
Program .NET Framework udostępnia interfejs API do pracy z szablonami identyfikatorów URI o nazwie UriTemplate.
UriTemplates
umożliwiają wykonanie następujących czynności:
Można wywołać jedną z metod
Bind
z zestawem parametrów w celu utworzenia w pełni zamkniętego identyfikatora URI zgodnego z szablonem. Oznacza to, że wszystkie zmienne w szablonie identyfikatora URI są zastępowane wartościami rzeczywistymi.Możesz wywołać
Match
() przy użyciu identyfikatora URI kandydata, który używa szablonu do dzielenia identyfikatora URI kandydata na jego części składowe i zwraca słownik zawierający różne części identyfikatora URI oznaczonego zgodnie ze zmiennymi w szablonie.Bind
() iMatch
() są odwrotne, tak aby można było wywołaćMatch
(Bind
( x ) ) i wrócić do tego samego środowiska, z którym rozpocząłeś.
Często (zwłaszcza na serwerze, gdzie konieczne jest przekazywanie żądania do operacji serwisowej na podstawie identyfikatora URI) chcesz śledzić zestaw obiektów UriTemplate w strukturze danych, która może niezależnie odnosić się do każdego z zawartych szablonów. UriTemplateTable reprezentuje zestaw szablonów identyfikatorów URI i wybiera najlepsze dopasowanie, biorąc pod uwagę zestaw szablonów i identyfikator URI kandydata. Nie jest to powiązane z żadnym konkretnym stosem sieciowym (w tym WCF), więc można tego używać wszędzie tam, gdzie to konieczne.
Model usługi WCF korzysta z UriTemplate i UriTemplateTable do kojarzenia operacji usługi z zestawem identyfikatorów URI opisanych przez UriTemplate. Operacja serwisowa jest powiązana z UriTemplate, przy użyciu albo WebGetAttribute albo WebInvokeAttribute. Aby uzyskać więcej informacji na temat UriTemplate i UriTemplateTable, zobacz UriTemplate i UriTemplateTable.
Atrybuty WebGet i WebInvoke
Usługi HTTP sieci Web WCF korzystają z czasowników pobierania (na przykład HTTP GET) oraz różnych czasowników wywołujących (na przykład HTTP POST, PUT i DELETE). Model programowania HTTP sieci Web WCF umożliwia deweloperom usług kontrolowanie zarówno szablonu identyfikatora URI, jak i czasownika skojarzonego z operacjami usługi za pomocą WebGetAttribute i WebInvokeAttribute. WebGetAttribute i WebInvokeAttribute umożliwiają kontrolowanie sposobu, w jaki poszczególne operacje są powiązane z identyfikatorami URI i metodami HTTP skojarzonymi z tymi identyfikatorami URI. Na przykład dodanie WebGetAttribute i WebInvokeAttribute w poniższym kodzie.
[ServiceContract]
interface ICustomer
{
//"View It"
[WebGet]
Customer GetCustomer():
//"Do It"
[WebInvoke]
Customer UpdateCustomerName( string id,
string newName );
}
Powyższy kod umożliwia wykonywanie następujących żądań HTTP.
GET /GetCustomer
POST /UpdateCustomerName
WebInvokeAttribute domyślnie wykorzystuje POST, ale można go użyć również dla innych metod.
[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 );
}
Aby zapoznać się z kompletnym przykładem usługi WCF korzystającej z modelu programowania HTTP sieci Web WCF, zobacz Instrukcje: tworzenie podstawowej usługi HTTP sieci Web WCF.
Parametry ciągu zapytania i adresy URL w UriTemplate
Usługi w stylu sieci Web można wywoływać z przeglądarki sieci Web, wpisując adres URL skojarzony z operacją usługi. Te operacje usługi mogą przyjmować parametry ciągu zapytania, które muszą być określone w postaci ciągu w adresie URL. W poniższej tabeli przedstawiono typy, które można przekazać w adresie URL i używanym formacie.
Typ | Format |
---|---|
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 (notacja wykładnicza jest tutaj niepotrzebna) |
Double | -1.79769313486232e308 - 1.79769313486232e308 (notacja wykładnicza nie jest wymagana) |
Char | Dowolny pojedynczy znak |
Decimal | Każda liczba dziesiętna w notacji standardowej (bez wykładnika) |
Boolean | Prawda lub fałsz (bez uwzględniania wielkości liter) |
String | Dowolny ciąg (ciąg o wartości null nie jest obsługiwany i nie wykonuje się escapingu) |
DateTime | MM/DD/RRRR MM/DD/RRRR HH:MM:SS [AM|PM] Dzień Miesiąc Rok Rok miesiąca HH:MM:SS [AM|PM] |
TimeSpan | DD.HH:MM:SS Where DD = Days, HH = Hours, MM = minutes, SS = Seconds |
Guid | Identyfikator GUID, np.: 936DA01F-9ABD-4d9d-80C7-02AF85C822A8 |
DateTimeOffset | MM/DD/RRRR HH:MM:SS MM:SS Where DD = Days, HH = Hours, MM = minutes, SS = Seconds |
Wyliczenia | Na przykład wartość wyliczenia, która definiuje wyliczenie, jak pokazano w poniższym kodzie.public enum Days{ Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; Każda z pojedynczych wartości wyliczenia (lub odpowiadających im wartości całkowitych) może być określona w ciągu zapytania. |
Typy, które mają TypeConverterAttribute , mogą konwertować typ do i z reprezentacji ciągu znaków. |
Zależy od konwertera typów. |
Formaty i model programowania HTTP sieci Web WCF
Model programowania HTTP sieci Web WCF ma nowe funkcje do pracy z wieloma różnymi formatami danych. W warstwie powiązania WebHttpBinding może odczytywać i zapisywać następujące rodzaje danych:
- XML
- JSON
- Nieprzezroczyste strumienie binarne
Oznacza to, że model programowania HTTP sieci Web WCF może obsługiwać dowolny typ danych, ale możesz programować w kontekście Stream.
Program .NET Framework 3.5 zapewnia obsługę danych JSON (AJAX), a także kanałów syndykacji (w tym ATOM i RSS). Aby uzyskać więcej informacji na temat tych funkcji, zobacz Web HTTP Formatting, WCF Syndication Overviewi AJAX Integration and JSON Support.
Model i zabezpieczenia programowania HTTP w sieci Web WCF
Ponieważ model programowania HTTP sieci Web WCF nie obsługuje protokołów WS-*, jedynym sposobem zabezpieczenia usługi HTTP sieci Web WCF jest uwidocznienie usługi za pośrednictwem protokołu HTTPS przy użyciu protokołu SSL. Aby uzyskać więcej informacji na temat konfigurowania protokołu SSL za pomocą usług IIS 7.0, zobacz Jak zaimplementować protokół SSL w usługach IIS.
Rozwiązywanie problemów z modelem programowania HTTP sieci Web WCF
Podczas wywoływania internetowych usług HTTP programu WCF przy użyciu ChannelFactoryBase<TChannel> do utworzenia kanału WebHttpBehavior używa EndpointAddress ustawionego w pliku konfiguracji, nawet jeśli do ChannelFactoryBase<TChannel>zostanie przekazana inna EndpointAddress .