2

Ich versuche, XML zu asp.net Kern zu schreiben 2:Beitrag XML asp.net Kern 2.0 web api

$.ajax({ 
    type: "POST", 
    url: 'api/Test', 
    data: "<test>hello<test>", 
    contentType: "application/xml", 
    success: function (response) { alert(response); }, 
}); 

Wie soll ich die Aktion schreiben, so dass es die XML als Parameter akzeptiert?

  • IActionResult Post([FromBody]string xml) -> xml ist null
  • IActionResult Post([FromBody]XElement xml) -> xml null ist
  • IActionResult Post(XElement xml) -> InvalidOperationException: Es konnte keine Instanz des Typs 'System.Xml.Linq.XElement' erstellen. Modellgebundene komplexe Typen dürfen keine abstrakten oder Werttypen sein und müssen einen parameterlosen Konstruktor haben.
  • IActionResult Post(string xml) -> xml ist null

in dem Startup.ConfigureServices:

services.AddMvc() 
    .AddXmlSerializerFormatters(); 

Wie die Steuerung zu schreiben, so dass es XML als Parameter akzeptiert? Ich weiß, ich kann es von HttpContext.Request lesen, aber ich möchte es Parameter

Antwort

1

Ich habe am Ende benutzerdefinierte InputFormatter erstellen, die ziemlich geradlinig war, aber wenn es bessere Alternative gibt, sind Sie herzlich eingeladen, ein zu schreiben Antworten!

public class XDocumentInputFormatter : InputFormatter, IInputFormatter, IApiRequestFormatMetadataProvider 
{ 
    public XDocumentInputFormatter() 
    { 
     SupportedMediaTypes.Add("application/xml"); 
    } 

    protected override bool CanReadType(Type type) 
    { 
     if (type.IsAssignableFrom(typeof(XDocument))) return true; 
     return base.CanReadType(type); 
    } 

    public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context) 
    { 
     var xmlDoc = await XDocument.LoadAsync(context.HttpContext.Request.Body, LoadOptions.None, CancellationToken.None); 
     return InputFormatterResult.Success(xmlDoc); 
    } 
} 

Registrieren Sie den XDocumentInputFormatter in startup.cs

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(options => options.InputFormatters.Insert(0, new XDocumentInputFormatter())); 
} 
Verwandte Themen