У меня есть контроллер, который возвращает пользовательскую строку XML, потому что приложение, которое потребляет Api, нуждается в определенном формате без каких-либо атрибутов и без тега <?xml ... />
поверх строк XML по умолчанию , EDIT: потребитель также не имеет заголовка запроса, который запрашивает текст/xml.ASP.NET 5 MVC 6 Заголовок ответа XML
Мои ConfigureServices в моем Startup.cs выглядит следующим образом:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
var mvc = services.AddMvc();
mvc.AddMvcOptions(options =>
{
options.InputFormatters.Remove(new JsonInputFormatter());
options.OutputFormatters.Remove(new JsonOutputFormatter());
});
mvc.AddXmlDataContractSerializerFormatters();
}
В мой контроллер, я пытался несколько решений я нашел в Интернете (закомментированного), но никто не даст мне содержание XML с ответом заголовка 'Content-Type: применение/XML' в хромированных Devtools:
[HttpGet("{ssin}")]
[Produces("application/xml")]
public string Get(string ssin)
{
var xmlString = "";
using (var stream = new StringWriter())
{
var xml = new XmlSerializer(person.GetType());
xml.Serialize(stream, person);
xmlString = stream.ToString();
}
var doc = XDocument.Parse(xmlString);
doc.Root.RemoveAttributes();
doc.Descendants("PatientId").FirstOrDefault().Remove();
doc.Descendants("GeslachtId").FirstOrDefault().Remove();
doc.Descendants("GeboorteDatumUur").FirstOrDefault().Remove();
doc.Descendants("OverledenDatumUur").FirstOrDefault().Remove();
Response.ContentType = "application/xml";
Response.Headers["Content-Type"] = "application/xml";
/*var response = new HttpResponseMessage
{
Content = new StringContent(doc.ToString(), Encoding.UTF8, "application/xml"),
};*/
return doc.ToString(); //new HttpResponseMessage { Content = new StringContent(doc., Encoding.UTF8, "application/xml") };
}
Что я могу попытаться получить его ответить приложения/XML?
EDIT1 (после ответа Luca Ghersi в): Startup.cs:
public Startup(IHostingEnvironment env)
{
// Set up configuration sources.
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; set; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
var mvc = services.AddMvc(config => {
config.RespectBrowserAcceptHeader = true;
config.InputFormatters.Add(new XmlSerializerInputFormatter());
config.OutputFormatters.Add(new XmlSerializerOutputFormatter());
});
mvc.AddMvcOptions(options =>
{
options.InputFormatters.Remove(new JsonInputFormatter());
options.OutputFormatters.Remove(new JsonOutputFormatter());
});
//mvc.AddXmlDataContractSerializerFormatters();
}
/*
* Preconfigure if the application is in a subfolder/subapplication on IIS
* Temporary fix for issue: https://github.com/aspnet/IISIntegration/issues/14
*/
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.Map("/rrapi", map => ConfigureApp(map, env, loggerFactory));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void ConfigureApp(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
//app.UseIISPlatformHandler();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
// Entry point for the application.
public static void Main(string[] args) => WebApplication.Run<Startup>(args);
Контроллер:
[HttpGet("{ssin}")]
[Produces("application/xml")]
public IActionResult Get(string ssin)
{
var patient = db.Patienten.FirstOrDefault(
p => p.Rijksregisternummer.Replace(".", "").Replace("-", "").Replace(" ", "") == ssin
);
var postcode = db.Postnummers.FirstOrDefault(p => p.PostnummerId == db.Gemeentes.FirstOrDefault(g =>
g.GemeenteId == db.Adressen.FirstOrDefault(a =>
a.ContactId == patient.PatientId && a.ContactType == "pat").GemeenteId
).GemeenteId
).Postcode;
var person = new person
{
dateOfBirth = patient.GeboorteDatumUur.Value.ToString(""),
district = postcode,
gender = (patient.GeslachtId == 101 ? "MALE" : "FEMALE"),
deceased = (patient.OverledenDatumUur == null ? "FALSE" : "TRUE"),
firstName = patient.Voornaam,
inss = patient.Rijksregisternummer.Replace(".", "").Replace("-", "").Replace(" ", ""),
lastName = patient.Naam
};
var xmlString = "";
using (var stream = new StringWriter())
{
var opts = new XmlWriterSettings { OmitXmlDeclaration = true };
using (var xw = XmlWriter.Create(stream, opts))
{
var xml = new XmlSerializer(person.GetType());
xml.Serialize(xw, person);
}
xmlString = stream.ToString();
}
var doc = XDocument.Parse(xmlString);
doc.Root.RemoveAttributes();
doc.Descendants("PatientId").FirstOrDefault().Remove();
doc.Descendants("GeslachtId").FirstOrDefault().Remove();
doc.Descendants("GeboorteDatumUur").FirstOrDefault().Remove();
doc.Descendants("OverledenDatumUur").FirstOrDefault().Remove();
return Ok(doc.ToString());
Спасибо за быстрый ответ, но, к сожалению (я забыл упомянуть об этом, добавив его на мой пост), потребитель не добавляет заголовок запроса «text/xml», поэтому согласование контента не является вариантом. Я должен заставить его либо запросить xml, либо заставить заголовок ответа ответить, что он возвращает «application/xml». – AppSum
Забудьте о согласовании содержимого.Если вы удалите форматировщик JSON, как и вы, и оставите только XML, он должен работать, я думаю, потому что он будет единственным доступным форматом для ASP.NET. –
По-прежнему он возвращает текст/plain. Я добавлю EDIT1 на свой пост, чтобы показать свои изменения. – AppSum