2010-09-29 4 views
4

Nous avons un projet Silverlight qui utilise les services RIA. Il y a du code que je veux partager entre ce projet et un service web. Je dois laisser le code là où il est maintenant, c'est-à-dire que je ne peux pas partager le code.Consommation de services RIA sans un projet Silverlight

Ce que je pensais être bon, c'est que le service Web appelle le service RIA. Il sera assis sur le même serveur. Je suis allé à mon projet de service Web et j'ai ajouté une référence de service au service ria. J'ai cliqué sur avancé et j'ai coché l'option pour «générer des opérations asynchrones». Je pensais que tout irait bien, mais j'ai reçu quelques avertissements. Le code client qu'il a généré manquait de tout code réel relatif aux appels asynchrones, et le fichier app.config est également vide. Voici les avertissements,

Warning 2 Custom tool warning: Cannot import wsdl:binding 
Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on. 
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='CarServiceSoap'] 
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='BasicHttpBinding_CarServiceSoap'] C:\Develop\DotNet\Trunk\Applications\WcfServices\CarTransmitter\CarTransmitter.Core\Service References\CarService\Reference.svcmap 1 1 CarTransmitter.Core 

Warning 3 Custom tool warning: Cannot import wsdl:port 
Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on. 
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='BasicHttpBinding_CarServiceSoap'] 
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:service[@name='CarService']/wsdl:port[@name='BasicHttpBinding_CarServiceSoap'] C:\Develop\DotNet\Trunk\Applications\WcfServices\CarTransmitter\CarTransmitter.Core\Service References\CarService\Reference.svcmap 1 1 CarTransmitter.Core 

Warning 1 Custom tool warning: Cannot import wsdl:portType 
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter 
Error: Referenced type 'CarData.Organisation, CarData, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' with data contract name 'Organisation' in namespace 'http://schemas.datacontract.org/2004/07/CarData' cannot be used since it does not match imported DataContract. Need to exclude this type from referenced types. 
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='CarServiceSoap'] C:\Develop\DotNet\Trunk\Applications\WcfServices\CarTransmitter\CarTransmitter.Core\Service References\CarService\Reference.svcmap 1 1 CarTransmitter.Core 

Répondre

0

Non fini complètement, est allé un peu plus loin. Les problèmes que je pose maintenant justifient une nouvelle question.

La solution au problème ci-dessus est de décocher l'option «réutiliser les types dans les assemblages référencés». Lorsque vous ajoutez une référence de service, vous cliquez sur le bouton Avancé et vous obtenez l'option «Réutiliser les types dans les assemblys référencés». C'est parce que je partage du code entre les deux projets que j'utilise, et que j'essayais de «réutiliser» les objets que j'avais dans le code partagé. Au lieu de cela, je voulais juste créer des objets proxy pour moi et ne pas réutiliser ces objets.

1

Utilisez l'option de projet de services RIA pour créer votre bibliothèque de services. Cela crée 2 projets qui sont liés ensemble (pour le code gen des objets proxy). Les deux ne sont en fait que des bibliothèques (1 Silverlight et 1 .Net)

Liez une bibliothèque client de services RIA à votre application Silverlight. Ensuite, liez le projet .web RIA à votre application web d'hébergement (pour l'utilisation standard de RIA). Vous pouvez également ajouter la bibliothèque .web à votre service Wcf en tant que .Net lib (ne pas le consommer en tant que service).

Si vous n'avez pas créé votre projet Silverlight principal en tant que projet de services RIA, vous devrez déplacer les paramètres du fichier app.config vers votre fichier web.config. Si vous disposez déjà des paramètres de prise en charge du service, vous devez uniquement copier la chaîne de connexion db. La chaîne de connexion db seulement devrait être nécessaire pour votre projet Wcf. Vous devriez alors être en mesure d'utiliser les appels RIA côté serveur (n'oubliez pas d'ajouter vos propres appels submitchanges car RIA le fait en coulisse une fois par lot de mises à jour), ou simplement utiliser la couche de données (EF, etc.) directement.

+0

Merci. J'ai changé la question. Fondamentalement, j'étais capable de travailler sur le fait que je devais sélectionner l'option 'générer des opérations asynchrones', mais cela ne générait pas vraiment de code valable. App.config était vide aussi. – peter

0

Oui. C'est possible de faire.

  1. Créer un projet de bibliothèque
  2. Ajouter LINQ au modèle Entité
  3. Ajouter public class DomainService1: LinqToEntitiesDomainService
  4. Vérifiez si votre web.config ressemble à celui

    [xml version = "1.0"?] [configuration] [configSections] [sectionGroup name = "system.serviceModel"] [section name = "domaineServices" type = "System.ServiceModel.DomainServices.Hosting.DomainServicesSection, System.ServiceModel.DomainServices.Hébergement, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35" allowDefinition = "MachineToApplication" requirePermission = "false" /] [/ sectionGroup] [/ configSections]

    [system.webServer] [validation validateIntegratedModeConfiguration = "false" /] [modules runAllManagedModulesForAllRequests = "true"] [ajouter name = "DomainServiceModule" preCondition = le type "managedHandler" = "System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = 31BF3856AD364E35 "/] [/ modules] [/system.webServer] [system.serviceModel] [domainServices] [points de terminaison] [add name = "OData" type = "System.ServiceModel.DomainServices.Hosting.ODataEndpointFactory, System.ServiceModel.DomainServices.Hosting.OData, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = 31bf3856ad364e35 "/] [ajouter name =" soap "type =" Microsoft.ServiceModel.DomainServices.Hosting.SoapXmlEndpointFactory, Microsoft.ServiceModel.DomainServices.Hosting, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = 31bf3856ad364e35 "/] [add name = "JSON" type = "Microsoft.ServiceModel.DomainServices.Hosting.JsonEndpointFactory, Microsoft.ServiceModel.DomainServices.Hosting, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = 31bf3856ad364e35" /] [/ endpoints] [/ domainServices] [serviceHostingEnvironment aspNetCompatibilityEnabled = "True" multipleSiteBindingsEnabled = "true" /] [/system.serviceModel]

    [connectionStrings] [ajouter name = "ASPNETDBEntities1" ConnectionString = "métadonnées = res: // /Model1.csdl|res: // /Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connexion chaîne = " source de données = localhost; catalogue initial = ASPNETDB; information de sécurité persistante = True; ID utilisateur = sa; password = votre mot de passe; multipleactiveresultsets = Vrai; App = EntityFramework " "providerName =" System.Data.EntityClient "/] [/ connectionStrings] [system.web] [compilation debug =" true "] [assemblies] [ajouter assembly = "System.Data.Entity, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = b77a5c5619 34e089" /] [/ assemblées] [/ compilation] [/system.web] [/ configuration]

    1. Do WEB Publishing localement et lien de service de test. Profitez-en!
Questions connexes