Archief - dotNET WCF en Entity

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Recipe4hate

Legacy Member
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)
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>

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:
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!

Moto

Legacy Member
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 :eek:, 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 problemen

Recipe4hate

Legacy Member
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:
Code:
 [ServiceContract]
    public interface IBrowserService
    {
        [OperationContract]
        List<SapdataCompact> GetDataByDateAndCarrier(DateTime? bD, DateTime? eD, string carID);
    }

Mijn DataContracts zijn simpele dataholderobjecten zoals:
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; }
    }

Recipe4hate

Legacy Member
Moto zei:
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 :eek:, 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 problemen

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... :)

Recipe4hate

Legacy Member
Met Fiddler krijg ik volgende gegevens:
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

SOAP:
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>

Response:
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.

NeverwinterX

Legacy Member
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 Tracing

Recipe4hate

Legacy Member
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...
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan