从swagger UI向web api控制器发送xml时获取空值

时间:2017-12-05 14:09:32

标签: asp.net-web-api asp.net-core swagger-ui

使用带有swagger的Asp.net核心开发Web API。从swagger UI将XML发布到Web API,但它在控制器端提供null。遵循以下步骤。

以下是添加了XML格式化程序的Startup.cs代码:

public void ConfigureServices(IServiceCollection services)
{
    //Adding XML Format Support
    services.AddMvc().AddXmlSerializerFormatters();

    // Register the Swagger generator, defining one or more Swagger documents
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v2", new Info { Title = "API", Version = "v2" });
        string xmlpath = System.AppDomain.CurrentDomain.BaseDirectory + @"SwaggerAPI.xml";
        c.IncludeXmlComments(xmlpath);
    });
}

这是控制器代码:

[Route("api/Employee")]
public class RuleController : Controller
{
    [HttpPost]
    [Route("add")]      
    [Consumes("application/json", "application/xml")]    
    public void Post([FromBody]Employee employee)
    {

    }       
}

public class Employee  
{  
    public int Id;  
    public string FirstName;  
    public string LastName;  
} 

从Swagger UI发布xml到web api:

PostingXMltoWebAPI

这是调试窗口:

DebugWindow

请提出我在这里错过的任何建议。任何有关这方面的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

在您提供的屏幕截图中,请求外壳与模型中使用的外壳不匹配。

XML is case sensitive,因此您需要更改请求的大小写以匹配您的POCO(Plain Old C#Object)所期望的大小。

在您的示例中,您要发送:

<?xml version="1.0>
  <Employee>
    <firstName>First</firstName>
    <lastName>Last</lastName>
  </Employee>
</xml>

这与后续屏幕截图中给出的POCO属性名称不匹配。大概你的POCO看起来会像这样:

public class Employee
{
  public string FirstName { get; set; }
  public string LastName { get; set; }
}

这意味着XML标记<firstName>未映射到POCO属性FirstName,因为XML标记没有前导大写F

将XML更改为以下内容应正确解析:

<?xml version="1.0>
  <Employee>
    <FirstName>First</FirstName>
    <LastName>Last</LastName>
  </Employee>
</xml>

请注意区别,因为它是一个微妙但重要的:

<firstName>First</firstName>

VS

<FirstName>First</FirstName>