我有一个Java Web服务器,它有2个端点:SystemManagement和UserManagement。 2个端点使用相同的库。因此,这两个端点中的几乎所有类都是相同的。
我有一个使用这两项服务的C#客户端。我知道WCF可以共享类。所以我创建了一个新项目,让我的客户项目引用了新项目。然后在新项目中创建一个公共类“session”。
namespace WcfExplore.UserManagement
{
[DataContract]
public partial class session : object, System.ComponentModel.INotifyPropertyChanged
{
private string sessionIdField;
private string useridField;
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 3)]
[DataMember]
public string sessionId
{
get { return this.sessionIdField; }
set
{
this.sessionIdField = value;
this.RaisePropertyChanged("sessionId");
}
}
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 4)]
[DataMember]
public string userid
{
get { return this.useridField; }
set
{
this.useridField = value;
this.RaisePropertyChanged("userid");
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName)
{
System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if (propertyChanged != null)
propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}
但是当我更新服务引用时,visual studio仍然会自己生成类“session”。
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.225")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://iboss2.service.iasia.com/")]
public partial class session : object, System.ComponentModel.INotifyPropertyChanged {
private string sessionIdField;
private string useridField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
public string sessionId {
get {
return this.sessionIdField;
}
set {
this.sessionIdField = value;
this.RaisePropertyChanged("sessionId");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=4)]
public string userid {
get {
return this.useridField;
}
set {
this.useridField = value;
this.RaisePropertyChanged("userid");
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName) {
System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if ((propertyChanged != null)) {
propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}
如何使2个服务引用使用公共类?我不希望2个服务引用生成它们自己的重复类。
答案 0 :(得分:0)
生成第二个服务引用时,可以尝试重用引用程序集中的类型选项。这将迫使visual studio反映第一个服务引用的类型,并尝试尽可能引用它们,而不是在不同的命名空间中重新创建它们。
通过以这种方式指定重用,visual studio使用/ r标志调用svcutil.exe。
但是,svcutil.exe使用DataContractSerializer
来帮助生成代码,不幸的是,在解析服务合同时,它有一个strict set of rules。
因此,除非您服务XSD遵守这套规则,否则svcutil.exe将切换为使用XmlSerializer
,它不支持/ r标志(或重用)。因此,您将无法重复使用类型。
您还可以使用WSCF.blue生成服务合同,因为它拥有自己的自定义序列化程序并支持重复使用类型。