development

WCF는 "set"이없는 속성에서 질식합니다.

big-blog 2020. 8. 30. 09:19
반응형

WCF는 "set"이없는 속성에서 질식합니다. 해결 방법이 있습니까?


서비스 메서드의 결과로 전달하는 클래스가 있으며 해당 클래스에는 가져 오기 전용 속성이 있습니다.

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message { get { return ""; } }
}

서비스 측면에서 예외가 발생합니다.

System.Runtime.Serialization.InvalidDataContractException : 'MyNamespace.ErrorBase'형식의 'Message'속성에 대한 설정된 메서드가 없습니다.

이 속성을 getter로만 가져야하며 사용자가 값을 할당하도록 허용 할 수 없습니다. 사용할 수있는 해결 방법이 있습니까? 아니면 추가 속성이 누락 되었습니까?


Message에 공용 getter를 제공하지만 보호 된 setter를 제공하여 하위 클래스 (및 속임수 때문에 DataContractSerializer) 만 값을 수정할 수 있도록합니다.


값을 업데이트 할 필요가없는 경우에도 WCFSerializer에서 setter를 사용하여 개체를 역 직렬화하고 값을 다시 설정합니다.

이것은 당신이 추구하는 것입니다 : WCF DataContracts


[DataMember(Name = "PropertyName")]
public string PropertyName
{
    get
    {
        return "";
    }
    private set
    { }
}

getter 만있는 경우 속성을 직렬화해야하는 이유는 무엇입니까? 읽기 전용 속성에 대한 DataMember 특성을 제거 할 수있는 것처럼 보이며 serializer는 속성을 무시합니다.


당신은 "아무것도하지 않는"세터를 가질 수 없습니까 ??

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message 
  {
      get { return ""; } 
      set { }
  }
}

아니면 DataContract 시리얼 라이저도 그럴까요 ??


DataMember 속성이있는 속성에는 항상 설정이 필요합니다. DataContract 구성원은 항상 값을 할당 할 수 있으므로 클라이언트 응용 프로그램에서 simmilar 개체를 다시 작성해야합니다.


ASP.NET MVC에서이 문제가 발생했으며 JSON 출력 항목의 이름을 제어 할 수 있도록 DataContractSerializer를 사용하고 싶습니다. 결국 저는 serializer를 .NET을 통해 setter (DataContractSerializer가 지원하지 않음) 및 속성 이름 제어 (ASP.NET MVC의 기본 제공 JSON serializer가 지원하지 않음)가없는 속성을 지원하는 JSON.NET으로 전환했습니다 [JsonProperty(PropertyName = "myName")].


실행 가능한 옵션 인 ErrorBase경우 기본 클래스로 사용하는 대신 다음과 같이 정의하십시오.

    public interface IError
    {
        string Message
        {
            [OperationContract]
            get;

            // leave unattributed
            set;
        }
    }

이제 setter가 존재하더라도 WCF 채널을 통해 클라이언트에 액세스 할 수 없으므로 마치 개인용 인 것처럼 보입니다.

참고 URL : https://stackoverflow.com/questions/2323277/wcf-chokes-on-properties-with-no-set-any-workaround

반응형