Клиент извлечения Aurelia - неподдерживаемый тип носителя - .NET Core WebAPI
Когда я пытаюсь опубликовать два параметра в формате JSON с помощью Aurelia Fetch Client в.NET Core WebAPI, я получаю: 415 (Unsupported Media Type)
ApplicationController
[HttpPost("getapplications")]
public ApplicationViewModel GetApplications([FromBody] ApplicationSearchModel model)
{
var applications = _applicationService.GetApplications().ToList();
return new ApplicationViewModel()
{
Applications = applications
};
}
public class ApplicationSearchModel
{
public DateTime? From { get; set; }
public DateTime? To { get; set; }
}
application.js
import { inject } from 'aurelia-framework';
import {HttpClient, json} from 'aurelia-fetch-client';
@inject(HttpClient)
export class Application {
constructor(httpClient) {
this.applications = [];
this.httpClient = httpClient;
}
getApplications() {
this.httpClient.fetch("http://localhost:9001/api/application/getapplications", {
method: "POST",
body: JSON.stringify({
From: '2017-02-18',
To: '2017-02-18'
}),
headers: {
"content-type": "application/json; charset=utf-8" //Tried without headers aswell
}
});
}
activate(params) {
this.getApplications();
}
}
Если я удалю [FromBody]
это сообщения, но свойства внутри моего ApplicationSearchModel
нулевой.
Когда я писал с почтальоном, используя следующие настройки:
Адрес:
http://localhost:9001/api/application/getapplications
Тело:
{
"from": "2017-02-18",
"to": "2017-02-18"
}
Заголовок:
Content-Type: application/json
Все работало и мои свойства внутри ApplicationSearchModel
не был нулевым
Когда я смотрю на запросы, которые генерирует Aurelia Fetch Client, кажется, что заголовок Content-Type отсутствует..
редактировать
Заголовки запроса:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:localhost:9001
Origin:http://localhost:9000
Referer:http://localhost:9000/
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
2 ответа
На самом деле это была проблема с CORS.
Я добавил настройки cors в Startup.cs, чтобы разрешить все источники:
// This method gets called by the runtime. Use this method to add services to the container
public void ConfigureServices(IServiceCollection services)
{
//CORS---------
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//CORS---------
app.UseCors("CorsPolicy");
loggerFactory.AddConsole();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
app.UseDefaultFiles();
app.UseStaticFiles();
// app.UseStaticFiles(new StaticFileOptions()
// {
// FileProvider = new PhysicalFileProvider(
// Path.Combine(Directory.GetCurrentDirectory(), "src")),
// RequestPath = new PathString("/src")
// });
}
И все заработало..
Мое приложение Aurelia размещено на порту:9000, а мое приложение.NET размещено на порту:90001. Идея состоит в том, чтобы обслуживать статические страницы из моего приложения.NET после публикации приложения, но в настоящее время в разработке я использую порт:9000 из-за BrowserSync, предоставляемого Aurelia (CORS не будет проблемой при публикации, но теперь при использовании порт:9000 локально).
Можно ли использовать порт:9000 локально и НЕ включать CORS?
Редактировать:
CORS включен только на локальном хосте:
app.UseCors(builder =>
{
builder.WithOrigins("http://localhost:9000")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
Ваши заголовки не настроены должным образом.
Так должно быть
{
"content-type": "application/json; charset=utf-8"
}
Вместо
{
"content-type", "application/json; charset=utf-8"
}