验证WCF Rest服务中Json对象的结构

验证WCF Rest服务中Json对象的结构,json,rest,validation,wcf,post,Json,Rest,Validation,Wcf,Post,我编写了一个WCF Rest服务,其中POST方法中的Json对象作为StudentDetails接收。现在我想验证它的结构,即它不应该包含比指定字段更多的字段/信息。 以下是我的服务(服务合同) 因此Json的结构应该是 { "StudentDetail" : { "Name" : "ABC", "Address" : "ABC", "Grade":"10" } } 我已经检查了在缺少某些字段并且工作正常时不允许接受请求的情况。现在我想知道,当Json数据包含一个或多个额外信息时,

我编写了一个WCF Rest服务,其中POST方法中的Json对象作为StudentDetails接收。现在我想验证它的结构,即它不应该包含比指定字段更多的字段/信息。
以下是我的服务(服务合同)

因此Json的结构应该是

{
"StudentDetail" : 
{
    "Name" : "ABC", "Address" : "ABC", "Grade":"10"
}
}
我已经检查了在缺少某些字段并且工作正常时不允许接受请求的情况。现在我想知道,当Json数据包含一个或多个额外信息时,请求应该失败(BadRequest)。例如,如果Json对象是:

{
"StudentDetail" : 
{
    "Name" : "ABC", "Address" : "ABC", "Grade":"10", "Extra" : "Item"
}
}
由于存在额外项目,因此它应该失败(BADDREQUEST)。 而且

{
"StudentDetail" : 
{
    "Name" : "ABC", "Address" : "ABC", "Grade":"10"
},
"New" : { "key" : "value" }

}
由于引入了额外的“新”项,因此它应该会失败(BadRequest)

请帮帮我。
谢谢

不幸的是,您无法使用wcf完成此操作。在WebAPI中,您可以简单地使用动态对象并验证输入。但在wcf中,您必须使用如下对象:

[Serializable]
public class WebServiceDictionary : ISerializable
{
    public Dictionary<string, string> Entries { get; }

    public WebServiceDictionary()
    {
        Entries = new Dictionary<string, string>();
    }
    public WebServiceDictionary(SerializationInfo info, StreamingContext context)
    {
        Entries = new Dictionary<string, string>();
        foreach (var entry in info)
            Entries.Add(entry.Name, entry.Value.ToString());
    }
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        foreach (var entry in Entries)
            info.AddValue(entry.Key, entry.Value);
    }
}
[DataContract]
public class StudentDetails
{

    [DataMember]
    public WebServiceDictionar StudentDetail { get; set; }
}
}
StudentDetail.Entries[Name]
var keys=Entries.Keys;
if(keys.length!=3)
//its not valid
if(!keys.contain("Address"))
//its not valid
.
.
.
现在,您可以通过以下方式访问
StudentDetail

[Serializable]
public class WebServiceDictionary : ISerializable
{
    public Dictionary<string, string> Entries { get; }

    public WebServiceDictionary()
    {
        Entries = new Dictionary<string, string>();
    }
    public WebServiceDictionary(SerializationInfo info, StreamingContext context)
    {
        Entries = new Dictionary<string, string>();
        foreach (var entry in info)
            Entries.Add(entry.Name, entry.Value.ToString());
    }
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        foreach (var entry in Entries)
            info.AddValue(entry.Key, entry.Value);
    }
}
[DataContract]
public class StudentDetails
{

    [DataMember]
    public WebServiceDictionar StudentDetail { get; set; }
}
}
StudentDetail.Entries[Name]
var keys=Entries.Keys;
if(keys.length!=3)
//its not valid
if(!keys.contain("Address"))
//its not valid
.
.
.
然后验证它。 首先,您可以按如下方式获取词典中的所有关键字:

[Serializable]
public class WebServiceDictionary : ISerializable
{
    public Dictionary<string, string> Entries { get; }

    public WebServiceDictionary()
    {
        Entries = new Dictionary<string, string>();
    }
    public WebServiceDictionary(SerializationInfo info, StreamingContext context)
    {
        Entries = new Dictionary<string, string>();
        foreach (var entry in info)
            Entries.Add(entry.Name, entry.Value.ToString());
    }
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        foreach (var entry in Entries)
            info.AddValue(entry.Key, entry.Value);
    }
}
[DataContract]
public class StudentDetails
{

    [DataMember]
    public WebServiceDictionar StudentDetail { get; set; }
}
}
StudentDetail.Entries[Name]
var keys=Entries.Keys;
if(keys.length!=3)
//its not valid
if(!keys.contain("Address"))
//its not valid
.
.
.
然后,您可以这样验证它们:

[Serializable]
public class WebServiceDictionary : ISerializable
{
    public Dictionary<string, string> Entries { get; }

    public WebServiceDictionary()
    {
        Entries = new Dictionary<string, string>();
    }
    public WebServiceDictionary(SerializationInfo info, StreamingContext context)
    {
        Entries = new Dictionary<string, string>();
        foreach (var entry in info)
            Entries.Add(entry.Name, entry.Value.ToString());
    }
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        foreach (var entry in Entries)
            info.AddValue(entry.Key, entry.Value);
    }
}
[DataContract]
public class StudentDetails
{

    [DataMember]
    public WebServiceDictionar StudentDetail { get; set; }
}
}
StudentDetail.Entries[Name]
var keys=Entries.Keys;
if(keys.length!=3)
//its not valid
if(!keys.contain("Address"))
//its not valid
.
.
.

请提供可能的解决方案或一些链接来完成它。感谢@David的回复,但我不太明白如何将其与我的代码集成。你能提供更多的细节以便我能利用它吗?另外,如何从“StudentDetail.Entries[Name]”访问额外字段,因为我不知道输入中可能存在的额外字段的名称?亲爱的@learner,欢迎您。你不明白代码的哪一部分?词条是一本简单的字典。您可以使用快捷键访问其快捷键。我更新我的答案。请看一下,我试过了,只能得到第一个内部Json对象“StudentDetail”并进行验证,但找不到额外的内部Jsob对象“New”。我通过实现您的代码更新了我的问题。请告诉我代码中缺少了什么,以及如何找到其他内部Jsob对象。