Udostępnij za pośrednictwem


Funkcje upraszczania programu WCF

W tym temacie omówiono nowe funkcje, które ułatwiają pisanie aplikacji WCF.

gRPC jako alternatywa dla programu WCF

gRPC to nowoczesna struktura RPC, która jest popularną alternatywą dla platformy WCF. Usługa gRPC jest oparta na protokole HTTP/2, który zapewnia wiele zalet w porównaniu z platformą WCF, w tym:

  • Wydajność: gRPC jest znacznie wydajniejszy niż WCF, szczególnie w przypadku długotrwałych połączeń.
  • Skalowalność: gRPC jest przeznaczony do skalowania do dużej liczby klientów i serwerów.
  • Zabezpieczenia: usługa gRPC obsługuje różne mechanizmy zabezpieczeń, w tym tls i uwierzytelnianie.
  • Międzyplatformowe: gRPC jest neutralna dla platformy i może być używana z różnymi językami programowania.

Aby uzyskać więcej informacji na temat tworzenia lub migrowania aplikacji WCF do usługi gRPC, zobacz:

Uproszczone wygenerowane pliki konfiguracji

Po dodaniu odwołania do usługi w programie Visual Studio lub użyciu narzędzia SvcUtil.exe jest generowany plik konfiguracji klienta. W poprzednich wersjach programu WCF te pliki konfiguracji zawierały wartość każdej właściwości powiązania, nawet jeśli jej wartość jest wartością domyślną. W programie WCF 4.5 wygenerowane pliki konfiguracji zawierają tylko te właściwości powiązania ustawione na wartość inną niż domyślna.

Poniżej przedstawiono przykład pliku konfiguracji wygenerowanego przez program WCF 3.0.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false"
                    hostNameComparisonMode="StrongWildcard" maxBufferSize="65536"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192"
                        maxArrayLength="16384" maxBytesPerRead="4096"
                        maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

Poniżej przedstawiono przykład tego samego pliku konfiguracji wygenerowanego przez program WCF 4.5.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

Programowanie kontraktu pierwszego kontraktu

WCF ma teraz wsparcie dla opracowywania kontraktów po raz pierwszy. Narzędzie svcutil.exe ma przełącznik /serviceContract, który umożliwia generowanie kontraktów usług i danych z dokumentu WSDL.

Dodawanie odwołania do usługi z przenośnego projektu podzestawu

Przenośne projekty podzestawu umożliwiają programistom zestawów .NET obsługę pojedynczego drzewa źródłowego i systemu kompilacji, jednocześnie obsługując wiele implementacji platformy .NET (desktop, Silverlight, Windows Telefon i Xbox). Przenośne projekty podzestawu odwołują się tylko do bibliotek przenośnych platformy .NET, które są zestawami, które mogą być używane w dowolnej implementacji platformy .NET. Środowisko deweloperskie jest takie samo jak dodawanie odwołania do usługi w dowolnej innej aplikacji klienckiej WCF. Aby uzyskać więcej informacji, zobacz Add Service Reference in a Portable Subset Project (Dodawanie odwołania do usługi w projekcie przenośnego podzestawu).

ASP.NET tryb zgodności został zmieniony domyślnie

Program WCF zapewnia ASP.NET tryb zgodności umożliwiający deweloperom pełny dostęp do funkcji w potoku HTTP ASP.NET podczas pisania usług WCF. Aby użyć tego trybu, należy ustawić aspNetCompatibilityEnabled atrybut na wartość true w <sekcji serviceHostingEnvironment> pliku web.config. Ponadto każda usługa w tej aplikacjiDomain musi mieć właściwość ustawioną RequirementsMode na AspNetCompatibilityRequirementsAttribute wartość Allowed lub Required. Domyślnie AspNetCompatibilityRequirementsAttribute jest teraz ustawiona Allowed wartość i domyślny szablon aplikacji usługi WCF ustawia aspNetCompatibilityEnabled atrybut na true. Aby uzyskać więcej informacji, zobacz Co nowego w programie Windows Communication Foundation 4.5 i usługach WCF oraz ASP.NET.

Ulepszenia przesyłania strumieniowego

  • Dodano nową obsługę przesyłania strumieniowego asynchronicznego do programu WCF. Aby włączyć przesyłanie strumieniowe asynchroniczne, dodaj DispatcherSynchronizationBehavior zachowanie punktu końcowego do hosta usługi i ustaw jego AsynchronousSendEnabled właściwość na true. Może to przynieść korzyści skalowalność, gdy usługa wysyła strumieniowo komunikaty do wielu klientów, którzy odczytują powoli. Program WCF nie blokuje już jednego wątku na klienta i zwolni wątki do obsługi innego klienta.

  • Usunięto ograniczenia dotyczące buforowania komunikatów, gdy usługa jest hostowana w usługach IIS. W poprzednich wersjach programu WCF podczas odbierania komunikatu dla usługi hostowanej przez usługi IIS, która korzystała z transferu komunikatów przesyłanych strumieniowo, ASP.NET buforować cały komunikat przed wysłaniem go do usługi WCF. Spowodowałoby to duże zużycie pamięci. To buforowanie zostało usunięte w programie .NET Framework 4.5, a teraz usługi WCF hostowane przez usługi IIS mogą rozpocząć przetwarzanie przychodzącego strumienia przed odebraniem całego komunikatu, co spowoduje włączenie rzeczywistego przesyłania strumieniowego. Dzięki temu program WCF może natychmiast reagować na komunikaty i umożliwia lepszą wydajność. Ponadto nie trzeba już określać wartości dla maxRequestLengthparametru , limit rozmiaru ASP.NET dla żądań przychodzących. Jeśli ta właściwość jest ustawiona, jest ona ignorowana. Aby uzyskać więcej informacji na temat maxRequestLength elementu <konfiguracji httpRuntime>. Nadal musisz skonfigurować parametr maxAllowedContentLength, Aby uzyskać więcej informacji, zobacz Limity żądań usług IIS.

Nowe wartości domyślne transportu

W poniższej tabeli opisano ustawienia, które zostały zmienione i gdzie można znaleźć dodatkowe informacje.

Właściwości Włączone Nowa wartość domyślna Więcej informacji
channelInitializationTimeout NetTcpBinding 30 sekund Ta właściwość określa, jak długo może potrwać uwierzytelnienie połączenia TCP przy użyciu protokołu framing platformy .NET. Klient musi wysłać dane początkowe, zanim serwer ma wystarczającą ilość informacji do przeprowadzenia uwierzytelniania. Ten limit czasu jest celowo mniejszy niż parametr ReceiveTimeout (10 minut), dzięki czemu złośliwi nieuwierzytelnieni klienci nie przechowują połączeń powiązanych z serwerem przez długi czas. Wartość domyślna to 30 sekund. Aby uzyskać więcej informacji na temat ChannelInitializationTimeout
listenBacklog NetTcpBinding 16 * liczba procesorów Ta właściwość na poziomie gniazda opisuje liczbę żądań "oczekujących akceptowanych" do kolejkowania. Jeśli kolejka listy prac nasłuchiwania zostanie wypełniona, nowe żądania gniazd zostaną odrzucone. Aby uzyskać więcej informacji na temat ListenBacklog
Maxpendingaccepts ConnectionOrientedTransportBindingElement

Smsvchost.exe
2 * liczba procesorów do transportu

4 * liczba procesorów dla SMSvcHost.exe
Ta właściwość ogranicza liczbę kanałów, które serwer może czekać na odbiorniku. Gdy MaxPendingAccepts jest zbyt niski, będzie mały interwał czasu, w którym wszystkie kanały oczekujące zaczęły obsługiwać połączenia, ale żadne nowe kanały nie zaczęły nasłuchiwać. Połączenie może pojawić się w tym interwale i zakończy się niepowodzeniem, ponieważ nic nie czeka na niego na serwerze. Tę właściwość można skonfigurować, ustawiając MaxPendingConnections właściwość na większą liczbę. Aby uzyskać więcej informacji, zobacz MaxPendingAccepts i Konfigurowanie usługi udostępniania portów Net.TCP
maxPending Połączenie ions ConnectionOrientedTransportBindingElement 12 * liczba procesorów Ta właściwość określa liczbę połączeń zaakceptowanych przez transport, ale nie zostały odebrane przez dyspozytor ServiceModel. Aby ustawić tę wartość, użyj MaxConnections elementu powiązania lub maxOutboundConnectionsPerEndpoint elementu powiązania. Aby uzyskać więcej informacji na temat MaxPendingConnections
Receivetimeout Smsvchost.exe 30 sekund Ta właściwość określa limit czasu odczytywania danych ramek TCP i wysyłania połączeń z połączeń bazowych. Istnieje to, aby ograniczyć czas, przez jaki usługa SMSvcHost.exe jest zaangażowana w odczytywanie danych preambuły z połączenia przychodzącego. Aby uzyskać więcej informacji, zobacz Konfigurowanie usługi udostępniania portów Net.TCP.

Uwaga

Te nowe wartości domyślne są używane tylko w przypadku wdrażania usługi WCF na maszynie przy użyciu programu .NET Framework 4.5. Jeśli wdrożysz tę samą usługę na maszynie z programem .NET Framework 4.0, zostaną użyte wartości domyślne programu .NET Framework 4.0. W takich przypadkach zaleca się jawne skonfigurowanie tych ustawień.

XmlDictionaryReaderQuotas

XmlDictionaryReaderQuotas Zawiera konfigurowalne wartości przydziału dla czytników słowników XML, które ograniczają ilość pamięci używanej przez koder podczas tworzenia komunikatu. Chociaż te limity przydziału można konfigurować, wartości domyślne zmieniły się tak, aby zmniejszyć prawdopodobieństwo, że deweloper będzie musiał je jawnie ustawić. MaxReceivedMessageSize Limit przydziału nie został zmieniony, aby nadal można było ograniczyć zużycie pamięci, co uniemożliwia ci radzenie sobie ze złożonością programu XmlDictionaryReaderQuotas. W poniższej tabeli przedstawiono limity przydziału, ich nowe wartości domyślne i krótkie wyjaśnienie, do czego służy każdy przydział.

Nazwa limitu przydziału Wartość domyślna opis
MaxArrayLength Int32.MaxValue Pobiera i ustawia maksymalną dozwoloną długość tablicy. Ten limit przydziału ogranicza maksymalny rozmiar tablicy elementów pierwotnych zwracanych przez czytnik XML, w tym tablic bajtów. Ten limit przydziału nie ogranicza zużycia pamięci w samym czytniku XML, ale w każdym składniku korzystającym z czytnika. Na przykład gdy DataContractSerializer używa czytnika zabezpieczonego za pomocą MaxArrayLengthprogramu , nie deserializuje tablic bajtów większych niż ten limit przydziału.
MaxBytesPerRead Int32.MaxValue Pobiera i ustawia maksymalną dozwoloną liczbę bajtów zwracanych dla każdego odczytu. Ten limit przydziału ogranicza liczbę bajtów odczytanych w ramach pojedynczej operacji odczytu podczas odczytywania tagu startowego elementu i jego atrybutów. (W przypadku nieprzesyłania strumieniowego sama nazwa elementu nie jest liczone względem limitu przydziału). Zbyt wiele atrybutów XML może używać nieproporcjonalnego czasu przetwarzania, ponieważ nazwy atrybutów muszą być sprawdzane pod kątem unikatowości. MaxBytesPerRead ogranicza to zagrożenie.
MaxDepth Głębokie 128 węzłów Ten limit przydziału ogranicza maksymalną głębokość zagnieżdżania elementów XML. MaxDepth współdziała z MaxBytesPerRead: czytelnik zawsze przechowuje dane w pamięci dla bieżącego elementu i wszystkich jego elementów nadrzędnych, więc maksymalne zużycie pamięci czytnika jest proporcjonalne do produktu tych dwóch ustawień. Podczas deserializacji głęboko zagnieżdżonego grafu obiektu deserializator jest zmuszony do uzyskania dostępu do całego stosu i zgłosić StackOverflowExceptionnieodwracalny element . Istnieje bezpośrednia korelacja między zagnieżdżaniem XML a zagnieżdżaniem obiektów zarówno dla obiektu , jak DataContractSerializer i XmlSerializer. MaxDepth służy do eliminowania tego zagrożenia.
MaxNameTableCharCount Int32.MaxValue Ten limit przydziału ogranicza maksymalną liczbę znaków dozwolonych w tabeli nazw. Tabela nazw zawiera pewne ciągi (takie jak przestrzenie nazw i prefiksy), które są napotykane podczas przetwarzania dokumentu XML. Ponieważ te ciągi są buforowane w pamięci, ten limit przydziału jest używany do zapobiegania nadmiernemu buforowaniu podczas przesyłania strumieniowego.
MaxStringContentLength Int32.MaxValue Ten limit przydziału ogranicza maksymalny rozmiar ciągu zwracany przez czytnik XML. Ten limit przydziału nie ogranicza zużycia pamięci w samym czytniku XML, ale w składniku korzystającym z czytnika. Na przykład gdy DataContractSerializer używa czytnika zabezpieczonego za pomocą MaxStringContentLengthprogramu , nie deserializuje ciągów większych niż ten limit przydziału.

Ważne

Aby uzyskać więcej informacji na temat zabezpieczania danych, zapoznaj się z artykułem "Using XML Sejf ly" (Używanie Sejf XML) w temacie Security Considerations for Data (Zagadnienia dotyczące zabezpieczeń danych).

Uwaga

Te nowe wartości domyślne są używane tylko w przypadku wdrażania usługi WCF na maszynie przy użyciu programu .NET Framework 4.5. Jeśli wdrożysz tę samą usługę na maszynie z programem .NET Framework 4.0, zostaną użyte wartości domyślne programu .NET Framework 4.0. W takich przypadkach zaleca się jawne skonfigurowanie tych ustawień.

Walidacja konfiguracji programu WCF

W ramach procesu kompilacji w programie Visual Studio pliki konfiguracji WCF są teraz weryfikowane. Lista błędów weryfikacji lub ostrzeżeń jest wyświetlana w programie Visual Studio, jeśli walidacja zakończy się niepowodzeniem.

Etykietki narzędzi edytora XML

Aby ułatwić nowym i istniejącym deweloperom usług WCF konfigurowanie swoich usług, edytor XML programu Visual Studio udostępnia teraz etykietki narzędzi dla każdego elementu konfiguracji i jego właściwości, które są częścią pliku konfiguracji usługi.

Ulepszenia basicHttpBinding

  1. Umożliwia pojedynczemu punktowi końcowemu programu WCF reagowanie na różne tryby uwierzytelniania.

  2. Umożliwia kontrolowanie ustawień zabezpieczeń usługi WCF przez usługi IIS