Thread: dotNET WCF en Entity
-
18-02-2013, 22:57 #1Banned
- Registered
- 13/05/06
- Location
- Hoeselt
- Posts
- 9,944
- iTrader
- 48 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 0/72
dotNET WCF en Entity
Collega's,
ik heb jullie hulp nodig.
Ik ben bezig met het leren van WCF.
Momenteel heb ik een WCF service die connectie met een DB maakt via Entity (waarvan ik LazyLoading heb uitgezet).
Het enige wat de WCF op dit moment moet doen is een stored procedure oproepen op de SQL DB en deze waardes in een generic List teruggeven naar mijn client (hetzij winforms, hetzij ASP.NET).
Deze WCF draait momenteel op een IIS7.5 server en heeft basicHTTPBindings. Over het algemeen loopt dit vrij goed, tot ik een te grote waarde wil opvragen.
Ik heb in mijn appConfig en webConfig volgende opgezet (ok, overdreven waardes, maar het is nu als test)
Wanneer ik de code nu run (en mijn client dus de app op IIS aanspreekt), loopt het programma voor een tiental seconden (dus zeker geen 5min, zoals in de config) en geeft dan volgende error:Code:<basicHttpBinding> <binding name="BasicHttpBinding_IBrowserService" closeTimeout="00:05:00" openTimeout="00:05:00" receiveTimeout="00:05:00" sendTimeout="00:05:00" maxBufferPoolSize="999999999" maxBufferSize="999999999" maxReceivedMessageSize="999999999" /> </basicHttpBinding>
An error occurred while receiving the HTTP response to [svc address]. This could be due to the service endpoint binding not using the HTTP protocol. THis could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down).
Daar WCF redelijk cryptische fouten geeft, weet ik niet goed waar ik moet zoeken. Oorspronkelijk gaf hij me een fout dat de datasize te klein was, dus die heb ik aangepast en de error is verdwenen.
Wanneer ik relatief weinig data (<3000 lijnen) uit de DB trek, loopt alles prima. Wanneer ik hierover ga, krijg ik dergelijke foutmeldingen.
Het hele gekke is: wanneer ik de WCF op localhost (dus niet op IIS, maar nog steeds via Entity over het netwerk) run, krijg ik mijn data wel!
Conclusie:
Alles werkt wanneer de response niet al te groot is.
Op Localhost lijkt alles steeds goed te werken.
Het lijkt me geen probleem met connection timeouts, omdat ik de error redelijk vlot krijg.
Kunnen jullie me aub verder helpen?
Is het WCF die out-of-memory loopt? Is het de IIS die niet toelaat dat er teveel data over de lijn loopt? Is het wat anders?
Indien jullie stukken code of xml-config willen zien, laat maar weten, dan post ik deze.
Alvast heel erg bedankt!Last edited by Recipe4hate; 18-02-2013 at 23:33.
no votes
-
-
18-02-2013, 23:35 #2Member
- Registered
- 17/07/02
- Location
- Wilrijk
- Posts
- 1,994
- iTrader
- 2 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 9/16
om te beginnen zeker eens Fiddler Web Debugger - A free web debugging tool installeren kunt ge zien wat voor data der word doorgestuurd, moest op het werk iemand zijn WCF service met EF derachter gebruiken en die stuurde dus meerdere malen zen volledige database door alles lekker eager loaded met includes
xml depth was groter dan 512
, dat komt ervan als mensen in het wilde weg wat frameworks gebruiken zonder te weten wat die dingen precies doen, gevolg al die tijd die ge denkt uit te sparen moet ge op het einde gebruiken om alle pitfalls van die frameworks te ontdekken
Beste advies is
Lees een boek over EF
Lees een boek over WCF
Probeer het dan nog eens
Het zijn beide zeer complexe frameworks die waarschijnlijk veel te complex zijn voor wat ge nodig hebt.
Probleem is dat ze als "Simpel" verkocht worden door MS
Nu ik heb meestal geen goesting om meerdere boeken te lezen om iets simpels te doen als data uit een db te halen en door te sturen.
Maar ik heb dus vroeger ook wel geprobeerd WCF te gebruiken zonder een boek te lezen en dan had ik meestal hetzelfde scenario
1) Ik krijg zo een error als "An error occurred while receiving the HTTP response to"
2) Ik google
3) Ik vind 10 mogelijke oplossingen in KB-articles of op StackOverflow
4) Ik probeer ze 1 voor 1
5) Laatste 2 oplossingen die ik probeer zijn meestal de juiste
6) Alles werkt weer even
7) Ik verander iets -> terug naar 1
Dus voor mij geen complexe frameworks meer als ik maar een aantal features ervan nodig heb, dan zoek ik wel een simpler framework, minder features, minder problemenno votes
-
18-02-2013, 23:38 #3Banned
- Registered
- 13/05/06
- Location
- Hoeselt
- Posts
- 9,944
- iTrader
- 48 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 0/72
Om er nog aan toe te voegen:
Ik heb gelezen dat je response een concreet object moet zijn.
Mijn ServiceContract bestond uit:
Code:[ServiceContract] public interface IBrowserService { [OperationContract] IEnumerable<SapdataCompact> GetDataByDateAndCarrier(DateTime? bD, DateTime? eD, string carID); }
Deze is (zonder resultaat) gewijzigd naar:
Mijn DataContracts zijn simpele dataholderobjecten zoals:Code:[ServiceContract] public interface IBrowserService { [OperationContract] List<SapdataCompact> GetDataByDateAndCarrier(DateTime? bD, DateTime? eD, string carID); }
Code:[DataContract] public class SapdataCompact { [DataMember] public string SOLDTOCODE { get; set; } [DataMember] public string SOLDTOCITY { get; set; } [DataMember] public string SOLDTOCOUNTRY { get; set; } [DataMember] public string SHIPTOCODE { get; set; } [DataMember] public string SHIPTOCITY { get; set; } [DataMember] public string SHIPTOCOUNTRY { get; set; } [DataMember] public string ROUTE { get; set; } [DataMember] public int SHIPREF { get; set; } [DataMember] public decimal CASEWIDTH { get; set; } [DataMember] public decimal CASEHEIGHT { get; set; } [DataMember] public decimal CASELENGTH { get; set; } [DataMember] public string CASEDIMUNIT { get; set; } [DataMember] public decimal? CASEWEIGHT { get; set; } [DataMember] public string CASEWEIGHTID { get; set; } [DataMember] public string HUID { get; set; } [DataMember] public DateTime DATEADDED { get; set; } [DataMember] public string CARRIER { get; set; } [DataMember] public string CASEID { get; set; } }no votes
-
18-02-2013, 23:42 #4Banned
- Registered
- 13/05/06
- Location
- Hoeselt
- Posts
- 9,944
- iTrader
- 48 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 0/72
Bedankt voor je tips.
Ik heb inderdaad nog 2 boeken op de plank staan: O'Reilly WCF en ADO.net Entity. Ben me momenteel door C# in depth van Jon Skeet aan het worstelen
Het komt er dus wel aan hoor!
De stack overflow methode heb ik ook al geprobeerd, jammer genoeg had ik zelfs bij de laatste 2 geen positief resultaat
Het probleem bij deze is, is dat er nu eigenlijk zoveel systemen tegelijk draaien dat ik niet weet wat te beginnen zoeken... in de configs? Op de client of server? Op de IIS? In WCF? etc...
no votes
-
19-02-2013, 00:04 #5Banned
- Registered
- 13/05/06
- Location
- Hoeselt
- Posts
- 9,944
- iTrader
- 48 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 0/72
Met Fiddler krijg ik volgende gegevens:
SOAP:Code:Request Count: 1 Bytes Sent: 678 (headers:431; body:247) Bytes Received: 675 (headers:163; body:512) ACTUAL PERFORMANCE -------------- ClientConnected: 22:59:25.627 ClientBeginRequest: 22:59:25.627 GotRequestHeaders: 22:59:25.627 ClientDoneRequest: 22:59:25.960 Determine Gateway: 62ms DNS Lookup: 1ms TCP/IP Connect: 41ms HTTPS Handshake: 0ms ServerConnected: 22:59:26.062 FiddlerBeginRequest: 22:59:26.062 ServerGotRequest: 22:59:26.063 ServerBeginResponse: 00:00:00.000 GotResponseHeaders: 00:00:00.000 ServerDoneResponse: 22:59:38.107 ClientBeginResponse: 22:59:38.113 ClientDoneResponse: 22:59:38.114 Overall Elapsed: 0:00:12.486 RESPONSE BYTES (by Content-Type) -------------- text/html: 512 ~headers~: 163
Response:Code:POST ********/HDCARRIERConnectionService/Services/BrowserService.svc HTTP/1.1 Content-Type: text/xml; charset=utf-8 VsDebuggerCausalityData: uIDPo6kjuVepyWVGmSi5rWLW6kgAAAAAo8Zz0LFrQkaFCydpFJK94C1iadVFPMhPve//Gych2jgACQAA SOAPAction: "http://tempuri.org/IBrowserService/GetDataByDateAndCarrier" Host: ********** Content-Length: 247 Expect: 100-continue Accept-Encoding: gzip, deflate Connection: Keep-Alive <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetDataByDateAndCarrier xmlns="http://tempuri.org/"><bD>2013-01-01T00:00:00</bD><eD>2013-01-31T00:00:00</eD><carID>TNT</carID></GetDataByDateAndCarrier></s:Body></s:Envelope>
Code:HTTP/1.1 504 Fiddler - Receive Failure Date: Mon, 18 Feb 2013 21:59:38 GMT Content-Type: text/html; charset=UTF-8 Connection: close Timestamp: 22:59:38.107 [Fiddler] ReadResponse() failed: The server did not return a response for this request.
no votes
-
19-02-2013, 01:03 #6Approved 9-lifer
- Registered
- 27/08/04
- Location
- Leuven
- Posts
- 930
- iTrader
- 0
- Mentioned
- 0 Post(s)
- Reputation
- 11/38
Als de boel out of memory gaat of te lang doet over een operatie moet je dit toch kunnen zien op de server of zelf kunnen loggen?
Gebruik desnoods WCF trace logging: Configuring TracingI am thee and thou art me and all of one is the other.
TED talk: Richard Dawkins on militant atheismno votes
-
19-02-2013, 10:50 #7Banned
- Registered
- 13/05/06
- Location
- Hoeselt
- Posts
- 9,944
- iTrader
- 48 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 0/72
no votes
-
19-02-2013, 11:28 #8Banned
- Registered
- 13/05/06
- Location
- Hoeselt
- Posts
- 9,944
- iTrader
- 48 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 0/72
Bij deze de tracelog:
Er wordt inderdaad een Exception gethrowed bij het verwerken van de request.
Volgende foutcode is hieraan gelinkt:
There was an error while trying to serialize parameter http://tempuri.org/:GetDataByDateAndCarrierResult. The InnerException message was 'Maximum number of items that can be serialized or deserialized in an object graph is '65536'. Change the object graph or increase the MaxItemsInObjectGraph quota. '. Please see InnerException for more details.
Edit: en bij deze opgelost door de dataContractSerializer een attribuut van maxItemsInObjectGraph te geven in de serviceBehaviors.
Bedankt voor jullie hulp!
Misschien een bijkomstig vraagje: waarom moet ik dergelijke configuratie opzetten op Client en Service? De logica lijkt me een beetje vreemd...Last edited by Recipe4hate; 19-02-2013 at 11:38.
no votes

