1

こんにちは、以下のコードを実行するとエラー 500 (内部サーバー エラー) が発生します。私の問題は、エラーの痕跡がまったくないことです。Visual Studio はそれをキャッチできないようです。

pers候補に追加しようとすると、次のコードは Candidate を返します。コードは失敗し、エラー 500 が発生します。

public class CheckController : ApiController
{
    public Candidate Get()
    {
        PersonAddressDescription pers = new PersonAddressDescription();

        Candidate candidate = new Candidate();

        //IF I REMOVE THIS NO PROBLEM
        candidate.address = pers;

        return candidate;
    }
}

AddressDescription クラス

/// <remarks/>
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(CompanyAddressDescription))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(PersonAddressDescription))]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.17626")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.crif-online.ch/webservices/crifsoapservice/v1.00")]
    public abstract partial class AddressDescription : object, System.ComponentModel.INotifyPropertyChanged {

        private Location locationField;

        private ContactItem[] contactItemsField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public Location location {
            get {
                return this.locationField;
            }
            set {
                this.locationField = value;
                this.RaisePropertyChanged("location");
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("contactItems", Order=1)]
        public ContactItem[] contactItems {
            get {
                return this.contactItemsField;
            }
            set {
                this.contactItemsField = value;
                this.RaisePropertyChanged("contactItems");
            }
        }

        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));
            }
        }
    }

AddressDescription を実装する PersonAddressDescription クラス

/// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.17626")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.crif-online.ch/webservices/crifsoapservice/v1.00")]
    public partial class PersonAddressDescription : AddressDescription {

        private string firstNameField;

        private string lastNameField;

        private string maidenNameField;

        private Sex sexField;

        private bool sexFieldSpecified;

        private string birthDateField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public string firstName {
            get {
                return this.firstNameField;
            }
            set {
                this.firstNameField = value;
                this.RaisePropertyChanged("firstName");
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public string lastName {
            get {
                return this.lastNameField;
            }
            set {
                this.lastNameField = value;
                this.RaisePropertyChanged("lastName");
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
        public string maidenName {
            get {
                return this.maidenNameField;
            }
            set {
                this.maidenNameField = value;
                this.RaisePropertyChanged("maidenName");
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
        public Sex sex {
            get {
                return this.sexField;
            }
            set {
                this.sexField = value;
                this.RaisePropertyChanged("sex");
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool sexSpecified {
            get {
                return this.sexFieldSpecified;
            }
            set {
                this.sexFieldSpecified = value;
                this.RaisePropertyChanged("sexSpecified");
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
        public string birthDate {
            get {
                return this.birthDateField;
            }
            set {
                this.birthDateField = value;
                this.RaisePropertyChanged("birthDate");
            }
        }
    }
4

1 に答える 1

3

addResp取得したオブジェクト( )には、オブジェクトグラフのどこかに循環参照が含まれていると思われます。循環参照をJSONシリアル化することはできません。

たとえば、コントローラー内に次のコードを配置して、このインスタンスをJSONシリアル化しようとしたときに何が起こるかをテストしてみてください。

TypeIdentifyAddressResponse addResp = ws.identifyAddress("test");
string json = JsonConvert.SerializeObject(addResp);


アップデート:

AddressDescriptionは抽象クラスのようで、実際のインスタンスはPersonAddressDescriptionです。[KnownType]次の属性を使用して、シリアライザーにそのことを示す必要があります。

[KnownType(typeof(PersonAddressDescription))]
[KnownType(typeof(CompanyAddressDescription))]
...
public abstract partial class AddressDescription : object, System.ComponentModel.INotifyPropertyChanged {
{
    ...
}

別の方法として、(すでに汚染されている)ドメインモデルを他の属性でさらに汚染したくない場合は、:内に既知のタイプを定義することもできますWebApiConfig.cs

config.Formatters.XmlFormatter.SetSerializer<Candidate>(
    new DataContractSerializer(typeof(Candidate),
    new Type[] { typeof(PersonAddressDescription) }));
于 2012-10-19T07:45:08.870 に答える