2009-05-02 15 views
9

Mam aplikację Silverlight, która uwzględnia listę klas możliwych do serializacji. W tych klasach są inne klasy serializowalne, z których niektóre są również na liście. Chodzi o to, że wszystko działa poprawnie, dopóki nie wypełnię jednej z listy klas nadających się do serializacji, która powoduje, że aplikacja silverlight rzuca wyjątek "Serwer zdalny zwrócił błąd: NotFound"Usługa Silverlight Webservice "Serwer zdalny zwrócił błąd: NotFound"

To jest kod, który wypełnia klasę (Don ' t być zastraszani przez dużą ilość kodu to po prostu napełniania klasy z informacji):

private SCharacter getSCharacter(Character userCharacter) 
     { 
      var iqcb = userCharacter.CharacterBodies; 
      var iqcs = userCharacter.CharacterStats; 
      var iqgs = userCharacter.CharacterSettings; 
      var iqcp = userCharacter.CharacterPoints; 
      var iqcproj = userCharacter.CharacterProjectiles; 

      var currChar = 
       new SCharacter 
       { 
        characterID = userCharacter.characterID, 
        characterName = userCharacter.characterName, 
        characterClassID = userCharacter.characterClassID, 
        userUsername = userCharacter.userUsername 
       }; 
      foreach (var cb in iqcb) 
      { 
       var scb = new SCharacterBody(); 
       scb.body.bodyId = cb.bodyId; 
       scb.body.bodyName = cb.Body.bodyName; 
       scb.bodyPart.bodyPartId = cb.BodyPart.bodyPartId; 
       scb.bodyPart.bodyPartName = cb.BodyPart.bodyPartName; 
       currChar.characterBodyList.Add(scb); 
      } 
      foreach (var cs in iqcs) 
      { 
       var scs = 
        new SCharacterStat 
        { 
          characterID = cs.characterID, 
          statId = cs.statId, 
          characterStatId = cs.characterStatId, 
          statName = cs.Stat.statName, 
          statValue = cs.statValue       
        }; 
       currChar.characterStatList.Add(scs); 
      } 
      foreach (var igs in iqgs) 
      { 
       var scs = new SCharacterSetting 
        { 
         characterID = igs.characterID, 
         modifierId = igs.GameSetting.modifierId, 
         modifierType = igs.GameSetting.Modifier.modifierType, 
         characterSettingId = igs.characterSettingId, 
         settingDescription = igs.GameSetting.settingDescription, 
         settingName = igs.GameSetting.settingName, 
         settingValue = igs.GameSetting.settingValue 
        }; 
       var gss = igs.GameSetting.Stat; 
       scs.stat.statId = gss.statId; 
       scs.stat.statName = gss.statName; 
       currChar.characterSettingList.Add(scs); 
      } 
      foreach (var cp in iqcp) 
      { 
       var scp = new SCharacterPoint 
       { 
        characterID = cp.characterID, 
        characterPointsId = cp.characterPointsId, 
        pointsId = cp.pointsId, 
        pointsName = cp.Point.pointsName, 
        pointsValue = cp.pointsValue      
       }; 
       currChar.characterPointList.Add(scp); 
      } 

      foreach (var cp in iqcproj) 
      { 
       var scp = 
        new SCharacterProjectile 
        { 
         characterId = cp.characterId, 
         characterProjectileId = cp.characterProjectileId, 
         particleId = cp.Projectile.particleId, 
         projectileHeight = cp.Projectile.projectileHeight, 
         projectileWidth= cp.Projectile.projectileWidth, 
         damageId =cp.Projectile.damageId, 
         damageDuration = cp.Projectile.Damage.damageDuration, 
         damageValue = cp.Projectile.Damage.damageValue, 
         projectileName = cp.Projectile.projectileName 
        }; 
       scp.force.forceName = cp.Projectile.forceName; 
       scp.force.impulseX = (float)cp.Projectile.Force.impulseX; 
       scp.force.impulseY = (float)cp.Projectile.Force.impulseY; 
       scp.force.torque = (float)cp.Projectile.Force.torque; 

       scp.projectileParticle.particleId = cp.Projectile.particleId; 
       scp.projectileParticle.particleName = cp.Projectile.Particle.particleName; 

       foreach (var psv in cp.Projectile.Particle.ParticleSettingValues) 
       { 
        var spsv = new SParticleSettingValue(); 
        spsv.particleId = psv.particleId; 
        spsv.particleSettingID = psv.particleSettingID; 
        spsv.particleSettingName = psv.ParticleSetting.particleSettingName; 
        spsv.particleSettingValue = psv.particleSettingValue1; 
        spsv.particleSettingValuesID = psv.particleSettingValueID; 
        scp.projectileParticle.particleSettingList.Add(spsv); 
       } 

       foreach (var pc in cp.Projectile.Particle.ParticleColours) 
       { 
        var spc = new SParticleColour(); 
        spc.colourHex = pc.colourHex; 
        spc.particleColourId = pc.particleColourId; 
        spc.particleId = pc.particleId; 
        scp.projectileParticle.particleColourList.Add(spc); 
       } 
       currChar.projectileList.Add(scp); 
      } 
      return currChar; 
     } 

W ciągu ostatnich 3 linii kodu jest currChar.projectileList.Add(scp);, jeśli usunąć tę linię kodu wszystko działa poprawnie. To, co uważałem, że może być przyczyną problemu, to odniesienia do cyuceli, ale sprawdziłem klasy i nie mogę ich znaleźć. W razie potrzeby będę wkleić kod z klas, które mają do czynienia z projectileList

Aktualizacja: Próbował debugować sama usługa i podobno jest tam problem z serializacji XML, można znaleźć pytanie here

Odpowiedz

11

Błąd, który otrzymujesz, jest generyczny i może wprowadzać w błąd. Problem w twoim przypadku może być związany z faktem, że niektóre typy nie są obsługiwane przez Silverlight, więc nie można go przekazać za pomocą WCF.

Aby uzyskać bardziej szczegółowe informacje o błędzie, użyj darmowego narzędzia o nazwie Skrzypek. Możesz znaleźć szczegółowy opis, jak go używać tutaj: WCF Essentials - Fiddler

+0

Dzięki! problem, który miałem był wynikiem brakującej biblioteki dll, którą dowiedziałem się po wykonaniu instrukcji na podanym przez ciebie linku. –

13

Następnym razem, należy włączyć WCF Tracing:

umieścić to w pliku web.config:

<system.diagnostics>  
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
     <listeners> 
      <add name="traceListener" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData= "c:\temp\WEBTraces.log" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

Czytaj więcej o tym tutaj: http://msdn.microsoft.com/en-us/library/ms733025.aspx

+2

Znalazłem, że Podgląd zdarzeń w systemie Windows rejestruje te błędy i wygenerował znacznie bardziej zwarty i czytelny komunikat o błędzie, który bardzo pomógł mi w debugowaniu błędu NotFound. – angularsen

Powiązane problemy