gpt4 book ai didi

c# - 多个服务的 WCF 之间的共享类型

转载 作者:太空宇宙 更新时间:2023-11-03 16:06:15 26 4
gpt4 key购买 nike

我有一个具有 2 个端点的 Java Web 服务器:SystemManagement 和 UserManagement。 2 个端点使用相同的库。因此,这两个端点中的几乎所有类都是相同的。

我有一个使用这 2 个服务的 C# 客户端。我知道 WCF 可以共享类。所以我做了一个新项目,让我的客户项目引用这个新项目。然后在新项目中创建一个公共(public)类“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 个服务引用使用公共(public)类?我不希望 2 个服务引用生成它们自己的重复类。

最佳答案

当您生成第二个服务引用时,您可以尝试重用引用程序集中的类型选项。这将强制 visual studio 反射(reflect)第一个服务引用的类型并尝试在可能的情况下引用它们,而不是在不同的命名空间中重新创建它们。

enter image description here

通过以这种方式指定重用,visual studio 使用/r 标志在后台调用 svcutil.exe。

但是,svcutil.exe 使用 DataContractSerializer 来帮助生成代码,不幸的是,它有一个 strict set of rules在解析您的服务契约(Contract)时。

因此,除非您为 XSD 服务遵守这组规则,否则 svcutil.exe 将切换为使用 XmlSerializer,它不支持/r 标志(或重复使用)。因此,您将无法重用类型。

您还可以使用 WSCF.blue生成您的服务契约(Contract),因为它有自己的自定义序列化程序并支持类型的重用。

关于c# - 多个服务的 WCF 之间的共享类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19222282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com