Asp.net core vs CORS
От: codenet Россия  
Дата: 27.08.16 11:53
Оценка:
Привет всем!

хочу добавить собственный обработчик на POST \ GET \ PUT запросы
и сделать это показалось довольно просто:


Start.cs
 public void ConfigureServices(IServiceCollection services)
        {
         services.AddMvcCore();
         services.Configure<MvcOptions>(options =>
         {
             options.InputFormatters.Add(new MyInputFormatter());
         });
                services.AddOptions();

             services.AddCors(o => o.AddPolicy("mp", builder =>
                {
                    builder.AllowAnyHeader()
                           .AllowAnyMethod()
                           .AllowAnyOrigin();
                }));

    }



MyInputFormater.cs
  public class MyInputFormater: InputFormatter
    {
        static MediaTypeHeaderValue protoMediaType = MediaTypeHeaderValue.Parse("application/mp-sarbuf");

        public override bool CanRead(InputFormatterContext context)
        {
            var request = context.HttpContext.Request;
            MediaTypeHeaderValue requestContentType = null;
            MediaTypeHeaderValue.TryParse(request.ContentType, out requestContentType);

            if (requestContentType == null)
            {
                return false;
            }

            return requestContentType.IsSubsetOf(protoMediaType);
        }

        public override Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
        {
            if (context == null)
                throw new ArgumentNullException(nameof(context));

            var request = context.HttpContext.Request;
            
            var resultObject = new ProtocolIn();
            if (Parse(request.Headers, ref resultObject))
            {
                var data = Encoding.UTF8.GetString(ReadFully(context.HttpContext.Request.Body));
                resultObject.Body = Convert.FromBase64String(data);
                return InputFormatterResult.SuccessAsync(resultObject);
            }

            return InputFormatterResult.FailureAsync();
        }

        private bool Parse(IHeaderDictionary header, ref ProtocolIn obj)
        {
            //...заполнение полей ProtocolIn 
            return true;
        }

        private byte[] ReadFully(Stream stream)
        {
            byte[] buffer = new byte[32768];
            using (var ms = new MemoryStream())
            {
                while (true)
                {
                    int read = stream.Read(buffer, 0, buffer.Length);
                    if (read <= 0)
                        return ms.ToArray();
                    ms.Write(buffer, 0, read);
                }
            }
        }
    }



но палки в колёса мне вставил CORS со своими запросами OPTIONS
когда он проверяет, а можно ли...
и его запросы с Method = "OPTIONS" перехватываются также моим MyInputFormater.

Как правильнее сделать чтобы и CORS правильно отвалидировал свои ограничения (пока у меня их нет в примере)
и не лез в мой "MyInputFormater" ?

сейчас первый запрос OPTIONS делает CORS,
CanRead говорит return false
asp.net cors
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.