2015-01-12 4 views
0

MailMessage 개체 (System.Net)를 사용하는 WebApi 끝점이 있습니다. MailMessage가 적절하게 비 직렬화되도록 사용자 정의 JsonConverters를 정의했습니다. 그러나 DefaultBodyModelValidator 개체 그래프를 탐색하고 하나의 첨부 파일 중 하나에있는 Stream 개체의 속성에 액세스하려고 시도하기 때문에 문제가 발생합니다. MailMessage 클래스 및 그 아래의 모든 항목에 대해이 통과를 어떻게 비활성화 할 수 있습니까?WebApi에서 하나의 모델 유형에 대한 모델 유효성 검사를 비활성화하려면 어떻게합니까?

+0

왜 당신은 WebApi 요청에은 MailMessage을받는 것입니까? MailMessage는 그 목적을위한 것이 아닙니다. 대신 MailMessage처럼 보이지만 완전히 제어 할 수있는 자신 만의 디자인 모델을 사용해야합니다. 일을 줄이려는 헛된 시도로 사람들이 스스로 창조 할 노동량을 놀라게하는 일은 결코 없습니다. –

+0

@ErikFunkenbusch : 맞춤 모델 구축 방법을 고려했습니다. MailMessage는 많은 추가 작업없이 JSON과의 사이를 매우 잘 직렬화하는 전자 메일의 미리 만들어진 '모델'입니다. MailMessage를 전적으로 복제 한 내 모델을 만든 다음 MailMessage의 매퍼를 해당 모델로 작성하고 다시 작성할 수는 있지만 불필요하게 복잡해 보입니다. – ChaseMedallion

+0

MailMessage가 이유 때문에 Serializable로 표시되지 않았으므로 일부러 고려하지 않았습니다. 이런 식으로 이러한 목적으로 설계되지 않은 클래스는 사용하지 않아야합니다. 이것은 거의 확실하게 당신을 물기 위해 되돌아 올 것이지만, 당신은 분명히 시간을 절약하기 위해 3 배 더 많은 일을 할 자유가 있습니다;) –

답변

1

나는이 할 수있는 적어도 하나의 방법을 발견했습니다, 컨트롤러에서

[JsonConverter(typeof(SuppressModelValidationJsonConverter))] 
public sealed class SuppressModelValidation<TValue> 
{ 
    private readonly TValue _value; 

    public SuppressModelValidation(TValue value) 
    { 
     this._value = value; 
    } 

    // this must be a method, not a property, or otherwise WebApi will validate 
    public TValue GetValue() 
    { 
     return this._value; 
    } 
} 

internal sealed class SuppressModelValidationJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     // GetGenericArguments(Type) from http://www.codeducky.org/10-utilities-c-developers-should-know-part-two/ 
     return objectType.GetGenericArguments(typeof(SuppressModelValidation<>)).Length > 0; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var valueType = objectType.GetGenericArguments(typeof(SuppressModelValidation<>)).Single(); 

     var value = serializer.Deserialize(reader, valueType); 
     return value != null ? Activator.CreateInstance(objectType, value) : null; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

을 나는 다음과 같습니다

public Task Send([FromBody] SuppressModelValidation<MailMessage> message) 
    { 
     // do stuff with message.GetValue(); 
    } 
관련 문제