Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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
C# 如果有效负载包含意外字段,如何返回BadRequest_C#_Asp.net Core_Json.net - Fatal编程技术网

C# 如果有效负载包含意外字段,如何返回BadRequest

C# 如果有效负载包含意外字段,如何返回BadRequest,c#,asp.net-core,json.net,C#,Asp.net Core,Json.net,我正在尝试进行修补操作,若请求主体包含合同中未指定的字段,那个么修补操作应该会失败。例如,如果我调用此方法: [HttpPatch("{id}")] public async Task<ActionResult> PatchResource( [FromRoute][Required] Guid id, [FromBody][Required] PatchRequest request) {/* whatever */} 我想返回400个错误的请求,可能有解释,如果

我正在尝试进行修补操作,若请求主体包含合同中未指定的字段,那个么修补操作应该会失败。例如,如果我调用此方法:

[HttpPatch("{id}")]
public async Task<ActionResult> PatchResource(
    [FromRoute][Required] Guid id,
    [FromBody][Required] PatchRequest request) {/* whatever */}
我想返回400个错误的请求,可能有解释,如果我得到这样的请求体

{
  "name": "Adam",
  "address" "NY City",
  "additional": true
}
我想回去

400错误请求-不希望属性“附加”


我知道,如果我在PatchRequest上设置自定义序列化程序,并将MissingMemberHandling设置为Error,那么在这种情况下,我可以通过抛出异常轻松获得500个内部服务器错误,但这没有意义,因为这里的错误是请求,不是服务器。

以下功能将准确返回与FromBody中定义的对象不同的属性

创建一个类,例如ValidationBase

在类中,创建一个方法来验证对象,例如ValidateModel

ValidateModel-包含验证的整个逻辑

控制器:端点

验证库:


以下功能将准确返回哪些属性与FromBody中定义的对象不同

创建一个类,例如ValidationBase

在类中,创建一个方法来验证对象,例如ValidateModel

ValidateModel-包含验证的整个逻辑

控制器:端点

验证库:

在PatchRequest模型中,添加一个JsonExtensionsData属性

public class PatchRequest
{
    public string Name { get; }
    public string Address { get; }
    public PatchRequest(string name, string address) { Name = name; Address = address; }

    // extra fields
    [JsonExtensionData]
    private IDictionary<string, JToken> _extraStuff;
}
然后在控制器中,如果extraStuff不为空,则会收到其他字段

在PatchRequest模型中,添加一个JsonExtensionsData属性

public class PatchRequest
{
    public string Name { get; }
    public string Address { get; }
    public PatchRequest(string name, string address) { Name = name; Address = address; }

    // extra fields
    [JsonExtensionData]
    private IDictionary<string, JToken> _extraStuff;
}


然后在控制器中,如果extraStuff不为空,则会收到其他字段

这篇文章可能会对你有所帮助遗憾的是,这篇文章涉及到不同的问题。它处理无效的模型,默认情况下,包含未指定属性的请求将生成有效的模型,因此我不能真正使用此处建议的任何非补丁的内容。这只是一个部分JSON对象,无论如何它都毫无用处。请参阅:。@ChrisPratt是的,它不是JSON修补程序,它仍然是HTTP修补程序,RFC 5789修补程序方法没有指定更改的描述应该是什么样子,而JSON修补程序的RFC 6902说明“它适合与HTTP修补程序方法一起使用”。application/json patch+json media类型用于标识此类修补程序文档。“这不是实现它的唯一兼容方式,在我的使用案例中,这是一种过度杀伤力,因为我只支持itWell中的replace操作。无论如何,HTTP补丁中没有限制发送或不发送内容的功能。即使存在这种情况,它也将是JSON补丁之类的标准正文格式的一部分,而您在这里肯定是非标准的。但是,由于您没有使用类似于JSON补丁的东西,而该补丁在ASP.NET Core中具有本机支持,因此您需要负责手动应用更改,因此您可以选择在手动过程中以任何方式处理无关的项目。本文可能会帮到您遗憾的是,这篇文章涉及到不同的问题。它处理无效的模型,默认情况下,包含未指定属性的请求将生成有效的模型,因此我不能真正使用此处建议的任何非补丁的内容。这只是一个部分JSON对象,无论如何它都毫无用处。请参阅:。@ChrisPratt是的,它不是JSON修补程序,它仍然是HTTP修补程序,RFC 5789修补程序方法没有指定更改的描述应该是什么样子,而JSON修补程序的RFC 6902说明“它适合与HTTP修补程序方法一起使用”。application/json patch+json media类型用于标识此类修补程序文档。“这不是实现它的唯一兼容方式,在我的使用案例中,这是一种过度杀伤力,因为我只支持itWell中的replace操作。无论如何,HTTP补丁中没有限制发送或不发送内容的功能。即使存在这种情况,它也将是JSON补丁之类的标准正文格式的一部分,而您在这里肯定是非标准的。但是,由于您没有使用ASP.NET Core中本机支持的JSON修补程序,因此您需要负责手动应用更改,因此您可以选择在手动过程中随意处理无关的项目。该代码如何报告错误属性?这一点都没有帮助,正文中包含未指定属性的请求将生成有效的模型,因为附加属性将被丢弃。@CodeCaster我重新生成了答案。现在,它返回不在列表中的特定字段object@Arion如果另一个更简单的解决方案不起作用,那么它将在JSONA中返回不必要的字段,而这段代码如何报告错误的属性呢,正文中包含未指定属性的请求将生成有效的模型,因为附加属性将被丢弃。@CodeCaster我重新生成了答案。现在它返回不在t中的特定字段
他object@Arion如果另一个更简单的解决方案不起作用,那么它将在JSONIt中返回不必要的字段。看起来它会起作用,尽管它需要我在所有请求模型类上设置它,并检查所有方法。你会想到如何使它更方便,更通用的解决方案吗?i、 作为方法上的属性,我想如果您能使它成为基类的一部分,并使您的模型都继承自它,那将是一个完美的选择。除此之外,我不确定它看起来是否有效,尽管它要求我在所有请求模型类上设置它,并检查所有方法。你会想到如何使它更方便,更通用的解决方案吗?i、 作为方法上的属性,我想如果您能使它成为基类的一部分,并使您的模型都继承自它,那将是一个完美的选择。除此之外,我不确定
public class ValidationBase
{

    public string ValidateObject(string json, object obj)
    {
        var dictJSON = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
        var listParameterInJSON = dictJSON.Keys.ToHashSet<string>();
        listParameterInJSON.ToList().ForEach(x => x = x.ToLower());

        var jsonObj = JsonConvert.SerializeObject(obj);
        var dictObj = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonObj);
        var listParameterInObj = dictObj.Keys.ToList();

        listParameterInObj = listParameterInObj.ConvertAll(d => d.ToLower());
        listParameterInObj.ToHashSet<string>();

        var fields = listParameterInJSON.Except(listParameterInObj);

        if (fields.ToList().Count == 0) return "";

        var result = "Didn't expect property ";

        foreach (var item in fields)
        {
            result += "'" + item + "'" + " ";
        }

        return result;
    }
}
public class PatchRequest
{
    public string Name { get; }
    public string Address { get; }
    public PatchRequest(string name, string address) { Name = name; Address = address; }

    // extra fields
    [JsonExtensionData]
    private IDictionary<string, JToken> _extraStuff;
}