Привет всем!
хочу добавить собственный обработчик на 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