Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core &引用;无法得到任何响应”;在Postman中,而不是在发送BadRequest(ModelState)时XML格式的ModelState错误_Asp.net Core_Asp.net Core Webapi - Fatal编程技术网

Asp.net core &引用;无法得到任何响应”;在Postman中,而不是在发送BadRequest(ModelState)时XML格式的ModelState错误

Asp.net core &引用;无法得到任何响应”;在Postman中,而不是在发送BadRequest(ModelState)时XML格式的ModelState错误,asp.net-core,asp.net-core-webapi,Asp.net Core,Asp.net Core Webapi,请原谅我的无知,这是我第一次尝试ASP.Net核心WebAPI。我使用的是AspNetCore.mvc1.1.4,以防万一。我正在使用Postman测试我的API 我有一个简单的HttpPost,它会发回预期的400个错误请求。对于此测试,我正在发送格式错误的XML,因此我的hostMessage无法正确反序列化。客户希望以XML发送和接收所有消息 [HttpPost("Message")] public IActionResult ReceiveMessage([FromBody] HostM

请原谅我的无知,这是我第一次尝试ASP.Net核心WebAPI。我使用的是AspNetCore.mvc1.1.4,以防万一。我正在使用Postman测试我的API

我有一个简单的HttpPost,它会发回预期的400个错误请求。对于此测试,我正在发送格式错误的XML,因此我的hostMessage无法正确反序列化。客户希望以XML发送和接收所有消息

[HttpPost("Message")]
public IActionResult ReceiveMessage([FromBody] HostMessage hostMessage)
{
    if (hostMessage == null)
    {
        return BadRequest();
    }
    return Ok();
}
这给了我一个很好的预期反应。 当我更改代码以使其返回错误时

[HttpPost("Message")]
public IActionResult ReceiveMessage([FromBody] HostMessage hostMessage)
{
    if (hostMessage == null)
    {
        return BadRequest(ModelState);
    }
    return Ok();
}
我希望得到一个状态为400的错误请求,在模型状态中发现异常(反序列化对象时出错),但是我得到的是“无法得到任何响应”

模型状态错误:

邮递员的实际回应:

所以问题是,为什么当我将ModelState添加到错误请求时,它不再返回预期的错误请求,而是说它无法得到任何响应

前后编辑? 好吧,我在写这篇文章的时候发现了。客户机需要XML格式的所有内容。我的配置服务是这样设置的

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddMvcOptions(x => x.InputFormatters.Insert(0, new XmlDataContractSerializerInputFormatter()))
        .AddMvcOptions(x => x.OutputFormatters.Insert(0, new XmlDataContractSerializerOutputFormatter()));
}
当我删除OutputFormatter时,我得到了JSON格式的预期输出。


因此,我更新了我的问题标题,现在询问如何以XML返回预期的ModelState错误。

要回答您关于如何获取错误消息的具体问题,您需要遍历
ModelStateDictionary
对象,直到
Errors
异常集合,并获取第一个异常的消息,如图中的对象树所示

如果这正是您想要的,我建议使用
ModelStateDictionary
的扩展方法来搜索您并返回您想要的消息。假设这就是您希望从ModelState获得的全部信息,并且如果存在多条消息,您可能需要多条消息,我将尝试以下方法:

公共静态列表查找错误(此ModelStateDictionary modelState)
{
列表错误=新列表();
foreach(modelState.Values中的var值)
{
foreach(value.Errors中的var错误)
{
如果(!string.IsNullOrWhiteSpace(error.ErrorMessage))
errors.Add(error.ErrorMessage);
if(error.Exception!=null)
errors.Add(error.Exception.ToString());//ToString方法获取您在本例中查找的消息
}
}
返回错误;
}
然后像这样使用:
返回BadRequest(ModelState.FindErrors());

如果异常消息真的是您想要的,那么这应该可以满足您的需要

    public static List<string> FindErrors(this ModelStateDictionary modelState)
    {
        List<string> errors = new List<string>();
        foreach (var value in modelState.Values)
        {
            foreach(var error in value.Errors)
            {
                if (!string.IsNullOrWhiteSpace(error.ErrorMessage))
                    errors.Add(error.ErrorMessage);

                if (error.Exception != null)
                    errors.Add(error.Exception.ToString()); // The ToString method gets the message you were looking for in this example
            }
        }

        return errors;
    }