2015-08-18 3 views
3

Мое приложение перестало работать после перехода на бета-версию 6/7, после расследования я обнаружил, что мой json-десериализатор больше не используется (Jil), он вызван для записи но не для чтения.MvcOptions.InputFormatters не работает на asp.net vnext beta7

Уже 3 дня я ищу форумы и читаю код aspnet, но я не нашел проблему.

я заметил, что JSON.net используется повсеместно в бета-версии 6, немного меньше в бета-версии 7.

Вот мой код:

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddMvcCore(options => 
     { 
      var jilFormatter = new JilMediaTypeFormatter(); 
      options.OutputFormatters.Clear(); 
      options.OutputFormatters.Add(jilFormatter); 
      options.InputFormatters.Clear(); 
      options.InputFormatters.Add(jilFormatter); 

      options.FormatterMappings.SetMediaTypeMappingForFormat("json", MediaTypeHeaderValue.Parse("application/json")); 

      options.ModelBinders.Add(new DocumentModelBinder()); 
      options.ModelBinders.Add(new DataTablesBinder()); 
     }); 
     services.AddDataProtection(); 
     services.AddWebEncoders(); 

    } 

Даже если я просто InputFormatters.Clear (), не добавляя объект, он сохраняет десериализацию запросов, я понятия не имею, как он это делает.

И мой JIL InputFormatter/OutputFormatter (ouputformatter работает, я могу разбить в CanWrite, но ничего не происходит для CanRead)

internal class JilMediaTypeFormatter : IOutputFormatter, IInputFormatter 
{ 
    private static readonly string [] _readableTypes = new[] { "application/json", "text/json", "text/javascript" }; 
    private static readonly Task<bool> _done = Task.FromResult(true); 

    private readonly Options _options = Options.RFC1123ExcludeNullsIncludeInherited; 


    public bool CanWriteResult(OutputFormatterContext context, Microsoft.Net.Http.Headers.MediaTypeHeaderValue contentType) 
    { 
     return contentType ==null || _readableTypes.Contains(contentType.MediaType.ToLowerInvariant()); 
    } 

    public Task WriteAsync(OutputFormatterContext context) 
    { 
     context.HttpContext.Response.ContentType = "application/json"; 
     using (var writer = new StreamWriter(context.HttpContext.Response.Body)) 
     { 
      JSON.Serialize(context.Object, writer, _options); 
      writer.Flush(); 
      return _done; 
     } 
    } 

    public bool CanRead(InputFormatterContext context) 
    { 
     return _readableTypes.Contains(context.HttpContext.Request.ContentType); 
    } 

    public Task<object> ReadAsync(InputFormatterContext context) 
    { 
     var reader = new StreamReader(context.HttpContext.Request.Body); 
     var result = JSON.Deserialize(reader, context.ModelType, _options); 
     return Task.FromResult(result); 
    } 
} 

ответ

6

В случае, если кто-то придет через тот же ПРОБЛЕМЕ, InputFormatters используются только тогда, когда [FromBody] используется в списке параметров этого параметра.

+0

Просто нажмите ... +10000000 –

Смежные вопросы