2009-01-26 9 views
16

Załóżmy, że mam do czynienia z usługą, która wymaga wysyłania dużych ilości danych.Ograniczanie usług WCF

Jeśli zaimplementuję to w WCF, czy WCF będzie dezaktywować usługę w oparciu o ilość pamięci potrzebną do wyświetlenia każdego żądania? Czy będę otrzymywać ciągłe wyjątki pamięci za każdym razem, gdy otrzymam dużą liczbę haseł do mojej usługi?

Jestem bardzo ciekaw, radzenia sobie z tym problemem poza WCF, jestem jeszcze trochę nowych do rozwoju usług ...

+0

Każda aplikacja .NET może wygenerować OutOfMemory wyjątek. Bardzo bym chciał, aby pewnego dnia zobaczyli inteligentnych hostów, ale wydaje się, że to wymagałoby kolejnej warstwy komunikacji między aplikacją a hostem. Gdyby było warto, najprawdopodobniej już istniałoby dla Windows Services. –

Odpowiedz

12

Podczas korzystania z atrybutów wiązania i readQuotas, takich jak sugeruje Andrew Hare, pozwoli to na praktycznie nieograniczony rozmiar dla większości praktycznych zastosowań, należy pamiętać, że napotkasz inne problemy, takie jak limity czasu, jeśli zaakceptujesz długo działające polecenie, nie ważne, jak ta usługa jest zbudowana (używając WCF lub nie).

Bez względu na rozmiar wiadomości, usługa WCF będzie wymagać dławienia w celu uzyskania wydajności, aby nie została zalana. Jeśli hostujesz go w usługach IIS lub WAS, będziesz mieć dodatkowe funkcje wbudowane w tych środowiskach hostingowych, które sprawią, że twoja usługa będzie o wiele bardziej "wysoce dostępna". Nadal jednak trzeba zwracać uwagę na problemy z współbieżnością. Poniższa konfiguracja WCF stanowi przykład ustawienia niektórych wartości dławienia.

<system.serviceModel> 

    ... 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="GenericServiceBehavior"> 
      <serviceTimeouts transactionTimeout="00:09:10"/> 
      <serviceThrottling 
      maxConcurrentCalls="20" 
      maxConcurrentSessions="20" 
      maxConcurrentInstances="20" 
      /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
+1

Dokładnie to, po czym jestem, wyobrażam sobie, że przejdziemy fazę strojenia po zmniejszeniu zużycia pamięci na połączenie jak najwięcej :). Doskonała odpowiedź – Spence

3

WCF ma limit rozmiaru domyślnego ładunek, który będzie odbierać wiadomości ponad pewna liczba bajtów. Można to oczywiście skonfigurować w sekcji powiązania pliku konfiguracyjnego. Oto przykład z ropy basicHttpBinding pokazujący wiele atrybutów dostępnych dla Ciebie:

<bindings> 
    <basicHttpBinding> 
     <binding name="testBinding" maxReceivedMessageSize="2147483647"> 
      <readerQuotas 
       maxDepth="2147483647" 
       maxStringContentLength="2147483647" 
       maxArrayLength="2147483647" 
       maxBytesPerRead="2147483647" 
       maxNameTableCharCount="2147483647" /> 
     </binding> 
    </basicHttpBinding> 

Chodzi o to, że można tworzyć wiele różnych powiązań, które można wykorzystać do różnych scenariuszy. Jest to miłe, ponieważ można dostroić sposób korzystania z usług i zwiększyć tylko limit rozmiaru wiadomości dla punktów końcowych, które ich potrzebują.

+0

Rozumiem, o co ci chodzi, ale gdybym był w stanie kontrolować rozmiar wiadomości, zrobiłbym to. Muszę kochać obrazy. – Spence

3

Jeśli używasz netTcpBinding lub NetNamedPipeBinding można użyć właściwości MaxConnections:

<bindings> 
    <netTcpBinding> 
    <binding name="myTCPBinding" maxConnections="15"/> 
    </netTcpBinding> 
</bindings> 
+0

To dotyczy mnie, więc +1, ale EnocnRoll's odpowiedź była bardzo jasna, może następnym razem :(. – Spence

+0

Yup - Właśnie poszerzyłem odpowiedź. :) –

Powiązane problemy