2013-07-25 35 views
0

我正在使用自定義媒體格式程序來讀取webapi中multipartform的發佈數據。處理自定義操作篩選器屬性中的序列化錯誤和驗證錯誤。在格式化程序中,我將輸入映射到類型對象ImageMedia。我想將任何serliazation錯誤添加到ModelState,以便我可以處理CustomFilterAttribute中的那些接收ActionContext的信息。下面是代碼:如何在自定義mediaFormatter中向模型狀態添加錯誤

public class ImageMediaFormatter : MediaTypeFormatter 
{ 
    public ImageMediaFormatter() 
    { 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/jpeg")); 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/jpg")); 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/png")); 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/gif")); 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data")); 
    } 

    public override bool CanReadType(Type type) 
    { 
     return type == typeof(ImageMedia); 
    } 

    public override bool CanWriteType(Type type) 
    { 
     return false; 
    } 

    public override Task<object> ReadFromStreamAsync(
     Type type, Stream stream, HttpContent request, 
     IFormatterLogger formatterContext) 
    { 
     return Task.Factory.StartNew<object>(() => 
     { 
      var streamProvider = new MultipartMemoryStreamProvider(); 
      var keys = new Dictionary<string, string>(); 

      var result = request.ReadAsMultipartAsync(streamProvider).Result; 

      //get and remove random slashes from posted vaues 
      var categoryid = 
      streamProvider.Contents.First(x => x.Headers.ContentDisposition.Name.Contains("userGeneratedCategoryId")).ReadAsStringAsync().Result.Replace("\"", string.Empty); 
      keys.Add(Constants.UserGeneratedCategoryId, categoryid); 

      var imageBuffer = 
       streamProvider.Contents.First(x => x.Headers.ContentDisposition.Name.Contains(Constants.ImageFile)).ReadAsByteArrayAsync().Result; 

      return new ImageMedia(keys, imageBuffer); 
     }); 
    }   
}   



public class ImageMedia 
{ 
    public ImageMedia(Dictionary<string, string> keys, byte[] imageBuffer) 
     : this() 
    { 
     var keyvaluePair = new KeyValuePair<string, string>(); 
     foreach (var property in GetType().GetProperties()) 
     { 
      try 
      { 
       keyvaluePair = keys.FirstOrDefault(pair => pair.Key.ToLower() == property.Name.ToLower()); 
       if (!string.IsNullOrEmpty(keyvaluePair.Key)) 
       { 
        property.SetValue(this, keyValuePair.Value, null); 
       } 
      } 
      catch (Exception ex) 
      { 
       // Add these serialization errors to the Model State so I can handle these in a Custom Validation Action Attribute 

       Errors.Add(keyvaluePair.Key, new List<string> { ex.Message });      
       IsValid = false;      
      } 
     } 
     Buffer = imageBuffer; 
    } 

    private ImageMedia() 
    { 
     Errors = new Dictionary<string, List<string>>();   
    } 

    public int UserGeneratedCategoryId { get; set; } 
    public byte[] Buffer { get;set;} 
} 

回答

1

你可以添加錯誤到在傳遞給ReadFromStreamAsync方法所提供的上下文IFormatterLogger

public override Task<object> ReadFromStreamAsync(Type type, Stream stream, HttpContent request, 
    IFormatterLogger formatterContext) 

實施例:

formatterLogger.LogError(errorPath: "OrderedDate", errorMessage: "Not a valid date"); 
相關問題