Thaxll'ssillyia
Captain
- Registriert
- Dez. 2007
- Beiträge
- 3.532
Hallo Community!
Ich habe einen Wcf-Service konfiguriert von Spring.Net. Dahinter liegen ein paar Services und DAOs, welche per Dependency Injection dem WCF mitgegeben werden. Verwendete Technologien:
- .NET Framework 4.6.1
- Spring.Net 2.0.1.45000
Mein Problem: Spring generiert wahllos neue Wcf-Instanzen, aber nicht nur für den Wcf-Service, sondern auch für alle Services und Daos. Dies braucht etwa 4 Sekunden, was natürlich in meiner Client-Anwendung für enorme Lags sorgt (hab noch kein async eingebaut). Gehostet wird der Wcf im Visual-Studio-eigenen IIS Express. Ich greife auf den Wcf-Service über eine Singeton-WcfServiceClient-Instanz zu.
Wenn ich den Client starte, dann erstellt Spring richtigerweise eine neue Wcf-Instanz (das gleiche passiert wenn ich im Browser die .svc aufrufe).
Ich rufe danach innerhalb von 50 ms den Wcf-Service erneut auf -> hier wird noch keine neue Instanz erstellt.
Dann rufe ich den Wcf-Service 5 Sekunden später getriggert über eine Schaltfläche auf -> eine neue Wcf-Instanz wird erstellt. Wenn ich den Button erneut drücke oder andere Funktionen des Wcf-Services aufrufe, wird ebenfalls eine neue Instanz erstellt.
Auf Client-Seite existiert definitiv nur eine WcfServiceClient-Instanz. Ich hab echt kein Plan aus welchem Grund oder nach welchem Muster neue Wcf-Instanzen erstellt werden.
Configs
svc Markup:
web-config:
Spring.WcfService.xml:
Laut Internet ist das Standard-Instanzverhalten bei Wcf-Services PerSession. In der Spring-Dokumentation steht nichts dazu, ob Spring daran was verändert. Auch hätte ich gedacht, dass Spring nur den Wcf-Service neu instanziiert, und die bereits angelegten Services wieder in die Properties injected anstatt alles neu zu erstellen...
Im Internet hab ich auch Hinweise darauf gefunden, dass der IIS die Instanzen erzeugt und dabei das InstanceBehaviour des WcfServices ignoriert. Aber dazu war nichts detailliertes erklärt.
Kann mir jemand helfen? Bin für jede Hilfe dankbar!
VG, Thax
Ich habe einen Wcf-Service konfiguriert von Spring.Net. Dahinter liegen ein paar Services und DAOs, welche per Dependency Injection dem WCF mitgegeben werden. Verwendete Technologien:
- .NET Framework 4.6.1
- Spring.Net 2.0.1.45000
Mein Problem: Spring generiert wahllos neue Wcf-Instanzen, aber nicht nur für den Wcf-Service, sondern auch für alle Services und Daos. Dies braucht etwa 4 Sekunden, was natürlich in meiner Client-Anwendung für enorme Lags sorgt (hab noch kein async eingebaut). Gehostet wird der Wcf im Visual-Studio-eigenen IIS Express. Ich greife auf den Wcf-Service über eine Singeton-WcfServiceClient-Instanz zu.
Wenn ich den Client starte, dann erstellt Spring richtigerweise eine neue Wcf-Instanz (das gleiche passiert wenn ich im Browser die .svc aufrufe).
Ich rufe danach innerhalb von 50 ms den Wcf-Service erneut auf -> hier wird noch keine neue Instanz erstellt.
Dann rufe ich den Wcf-Service 5 Sekunden später getriggert über eine Schaltfläche auf -> eine neue Wcf-Instanz wird erstellt. Wenn ich den Button erneut drücke oder andere Funktionen des Wcf-Services aufrufe, wird ebenfalls eine neue Instanz erstellt.
Auf Client-Seite existiert definitiv nur eine WcfServiceClient-Instanz. Ich hab echt kein Plan aus welchem Grund oder nach welchem Muster neue Wcf-Instanzen erstellt werden.
Configs
svc Markup:
Code:
<%@ ServiceHost Language="C#" Debug="true" Service="Kassensystem.Server.WcfService.WcfService" CodeBehind="WcfService.svc.cs" Factory="Spring.ServiceModel.Activation.ServiceHostFactory" %>
web-config:
Code:
<?xml version="1.0" ?>
<configuration>
<configSections>
<sectionGroup name="spring">
<section name="context"
type="Spring.Context.Support.ContextHandler, Spring.Core" />
<section name="parsers"
type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core" />
</sectionGroup>
</configSections>
<spring>
<context name="spring.root"
id="connectorConfigFiles">
<resource uri="~/bin/Config/Spring.Persistence.xml" />
<resource uri="~/bin/Config/Spring.Service.xml" />
<resource uri="~/bin/Config/Spring.Database.xml" />
<resource uri="~/bin/Config/Spring.TestData.xml" />
<resource uri="~/bin/Config/Spring.WcfService.xml" />
</context>
<parsers>
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data" />
<parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data" />
</parsers>
</spring>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext"
value="true" />
</appSettings>
<system.web>
<compilation debug="true"
targetFramework="4.6.1" />
<httpRuntime targetFramework="4.6.1"
maxRequestLength="204800"
executionTimeout="7200" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"
httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding"
scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<bindings>
<basicHttpBinding>
<binding name="httpBinding"
maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647"
receiveTimeout="00:40:00"
openTimeout="00:40:00"
closeTimeout="00:40:00"
sendTimeout="00:40:00">
<readerQuotas maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="Kassensystem.Server.WcfService.WcfService">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="httpBinding"
contract="Kassensystem.Server.WcfService.IWcfService" />
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<directoryBrowse enabled="true" />
</system.webServer>
</configuration>
Spring.WcfService.xml:
Code:
<?xml version="1.0"
encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.net
http://www.springframework.net/xsd/spring-objects.xsd"
xmlns:db="http://www.springframework.net/database"
xmlns:tx="http://www.springframework.net/tx">
<object id="Kassensystem.Server.WcfService.WcfService"
type="Kassensystem.Server.WcfService.WcfService, Kassensystem.Server">
<property name="ArticleGroupService"
ref="articleGroupService" />
<property name="ArticleHistoryBaseService"
ref="articleHistoryBaseService" />
<property name="ArticleService"
ref="articleService" />
<property name="ClearingService"
ref="clearingService" />
<property name="CustomerCheckinService"
ref="customerCheckinService" />
<property name="CustomerService"
ref="customerService" />
<property name="ExtraordinaryPaymentService"
ref="extraordinaryPaymentService" />
<property name="PaymentHistoryService"
ref="paymentHistoryService" />
<property name="ShoppingCartHistoryService"
ref="shoppingCartHistoryService" />
<property name="TariffClassService"
ref="tariffClassService" />
<property name="UserService"
ref="userService" />
<property name="TestData"
ref="testData" />
</object>
</objects>
Laut Internet ist das Standard-Instanzverhalten bei Wcf-Services PerSession. In der Spring-Dokumentation steht nichts dazu, ob Spring daran was verändert. Auch hätte ich gedacht, dass Spring nur den Wcf-Service neu instanziiert, und die bereits angelegten Services wieder in die Properties injected anstatt alles neu zu erstellen...
Im Internet hab ich auch Hinweise darauf gefunden, dass der IIS die Instanzen erzeugt und dabei das InstanceBehaviour des WcfServices ignoriert. Aber dazu war nichts detailliertes erklärt.
Kann mir jemand helfen? Bin für jede Hilfe dankbar!
VG, Thax