簡體   English   中英

WCF多個服務之間的共享類型

[英]Share Types between WCF of Multiple Services

我有一個具有2個端點的Java Web服務器:SystemManagement和UserManagement。 2個端點使用相同的庫。 因此,這兩個端點中的幾乎所有類都是相同的。

我有一個使用這2個服務的C#客戶端。 我知道WCF可以共享課程。 因此,我創建了一個新項目,並讓我的客戶項目引用了該新項目。 然后在新項目中進行一個普通的類“會話”。

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仍會自行生成類“會話”。

[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個服務引用生成自己的重復的類。

生成第二個服務引用時,可以嘗試從引用的程序集重用類型選項。 這將迫使Visual Studio反映第一個服務引用的類型,並嘗試在可能的情況下引用它們,而不是在其他命名空間中重新創建它們。

在此處輸入圖片說明

通過以這種方式指定重用,Visual Studio使用/ r標志在幕后調用svcutil.exe。

但是,svcutil.exe使用DataContractSerializer來幫助生成代碼,不幸的是,在解析服務合同時,它具有一套相當嚴格的規則

因此,除非您為XSD服務,否則svcutil.exe將切換為使用XmlSerializer ,該XmlSerializer不支持/ r標志(或重新使用)。 因此,您將無法重復使用類型。

您還可以使用WSCF.blue生成服務合同,因為它具有自己的自定義序列化程序並支持類型的重用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM