1. #1

    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)
    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!
    Last edited by Recipe4hate; 18-02-2013 at 23:33.
    no votes  

  2. #2
    Moto's Avatar
    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 problemen
    no votes  

  3. #3

    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:
    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; }
        }
    no votes  

  4. #4

    Registered
    13/05/06
    Location
    Hoeselt
    Posts
    9,944
    iTrader
    48 (100%)
    Mentioned
    0 Post(s)
    Reputation
    0/72
    Quote Originally Posted by Moto View Post
    This quote is hidden because you are ignoring this member. Show
    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 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...
    no votes  

  5. #5

    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:
    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.
    no votes  

  6. #6
    NeverwinterX's Avatar
    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 Tracing
    I am thee and thou art me and all of one is the other.
    TED talk: Richard Dawkins on militant atheism
    no votes  

  7. #7

    Registered
    13/05/06
    Location
    Hoeselt
    Posts
    9,944
    iTrader
    48 (100%)
    Mentioned
    0 Post(s)
    Reputation
    0/72
    Quote Originally Posted by NeverwinterX View Post
    This quote is hidden because you are ignoring this member. Show
    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
    Die ga ik vandaag opzetten!
    no votes  

  8. #8

    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  

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

Log in

Log in