2012-09-18 1 views
3

je générer deux contrats de référence de service pour les fichiers .asmx dans Visual Studio 2010.Visual Studio génère un de mes références de service avec Runtime.Serialization, mais les autres génèrent avec ServiceModel

J'ai créé les deux références de service dans un mode identique. Je fais un clic droit sur 'Références de service' -> 'Ajouter une référence de service ..' -> 'Découvrir' -> Renommer l'espace de noms -> OK.

Ceci est le plus haut sommet code généré automatiquement à partir References.cs pour le service correctement généré:

namespace CableSolve.Web.Api.Tests.ComponentServicesProxy { 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
    [System.ServiceModel.ServiceContractAttribute(Namespace="http://www.cormant.com/cswebapi", ConfigurationName="ComponentServicesProxy.ComponentServicesSoap")] 
    public interface ComponentServicesSoap { 

Ceci est le code pour le service mal généré:

namespace CableSolve.Web.Api.Tests.WorkflowServicesProxy { 
    using System.Runtime.Serialization; 
    using System; 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")] 
    [System.Runtime.Serialization.DataContractAttribute(Name="OrderDto", Namespace="http://www.cormant.com/cswebapi")] 
    [System.SerializableAttribute()] 
    public partial class OrderDto : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged { 

Il est clair WorkflowServicesProxy utilise System.Runtime.Serialization où ComponentServicesProxy utilise System.ServiceModel. Je ne sais pas ce qui déclenche la génération de ma deuxième référence de service à l'aide de System.Runtime.Serialization. Est-ce que quelqu'un sait ce qui pourrait causer cela? Ma classe OrderDto n'a pas le DataContractAttribute, cependant, il ne possède d'autres attributs:

[Serializable] 
[XmlRoot("Order"), SoapType("Order")] 
public class OrderDto : IDto 

Cette référence de service a été correctement avant la génération de code. Il semble que, entre deux builds, il a changé.

déclarations pour mes deux services sont identiques:

[WebService(Namespace = "http://www.cormant.com/cswebapi")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ToolboxItem(false)] 
public class WorkflowServices : WebService 

[WebService(Namespace = "http://www.cormant.com/cswebapi")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ToolboxItem(false)] 
public class ComponentServices : WebService 

configurations de référence de service sont identiques:

enter image description here

Mise à jour: Alors que j'ai essayé la réponse proposée sans succès, j'ai appris des informations. Si je supprime tout le code de mon fichier asmx et recrée la référence du service, il revient à ServiceModel. Donc, il y a quelque chose dans le code lui-même.

Répondre

3

Vous partiellement répondu à votre propre question

Ma classe OrderDto n'a pas le DataContractAttribute

Cela combiné avec le fait que je parie que OrderDTO réside à l'intérieur de l'ensemble CableSolve.Orders et à la fois le client et serveur partager cet assembly. Parce qu'il est (techniquement) un type connu, et qu'il n'est pas explicitement marqué comme un contrat de données, le générateur de code utilise la référence de la DLL et utilise Runtime.Serialization pour sérialiser et transférer l'objet au lieu de ServiceModel.

enter image description here

comme un changement « Solution » de « réutilisation Tous » à l'autre option, cochez toutes les cases sauf celle de votre assemblée commune référencé.

+0

Cela a sonné, mais je ne vois aucune différence lorsque vous suivez vos instructions. J'ai tenté de réutiliser tous les assemblages sauf CableSolve.Orders, mais le même fichier references.cs a été généré.Puis j'ai réessayé après avoir supprimé System.Runtime.Serialization de mon projet, mais toujours la même chose. Je vais certainement garder cela à l'esprit, cependant, je suppose que vous avez raison. –

+0

Donc, c'est clair que vous avez raison, mais je me bats encore. Si je simplifie mon service Web à une seule méthode, je suis en mesure de contrôler l'introduction de Runtime.Serialization en référençant/supprimant la référence à mon objet DTO. Cependant, votre solution de suggestion n'affecte rien. Je vais continuer à bricoler avec ça. –

+0

Si vous n'utilisez pas une classe commune qui est sérialisable alors (je pense) vous devez toujours marquer n'importe quel DTO comme 'DataContract's afin qu'ils puissent être envoyés sur le fil correctement. –

Questions connexes