验证WCF Rest Service中Json对象的结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了验证WCF Rest Service中Json对象的结构相关的知识,希望对你有一定的参考价值。

我编写了一个WCF Rest服务,其中POST方法Json Object作为StudentDetails收到。现在我想验证它的结构,它不应该包含额外的字段/信息而不是指定的字段。 以下是我的服务(ServiceContract)

namespace RestService
{

[ServiceContract]
public interface IRestService
{
[OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "/SaveStudent", RequestFormat =WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json)]
    string SaveStudent(StudentDetails studentDetails);
}

[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 WebServiceDictionary StudentDetail { get; set; }
}
}

这是服务的实现

namespace RestService
{

public class RestService : IRestService
{

    public string SaveStudent(StudentDetails studentDetails)
    {
        SqlHelper sql = new SqlHelper();
        sql.OpenConnection();

        WebServiceDictionary student = studentDetails.StudentDetail;



        if (student.Entries.Keys.Count != 3)
        {
            WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.BadRequest;
            return null;
        }
        sql.SaveJson(student.Entries["Name"], student.Entries["Address"], int.Parse(student.Entries["Grade"]));
        sql.CloseConnection();

        return "Passed";
    }
}
}

所以Json的结构应该是

{
"StudentDetail" : 
{
    "Name" : "ABC", "Address" : "ABC", "Grade":"10"
}
}

当有/哪些字段丢失且工作正常时,我已经检查了是否接受了请求。现在我希望当Json数据包含一个或多个额外信息时,请求应该失败(BadRequest)。例如,如果Json对象是:

{
"StudentDetail" : 
{
    "Name" : "ABC", "Address" : "ABC", "Grade":"10", "Extra" : "Item"
}
}

由于Extra项目存在,因此它应该失败(BadRequest)。并且

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

}

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

请帮我。谢谢

答案

不幸的是你无法用wcf做到这一点。在web api中,您只需使用动态对象并验证输入。但是在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

StudentDetail.Entries[Name]

然后验证它。首先你可以得到你字典中的所有键,如下所示:

var keys=Entries.Keys;

然后你可以像这样验证它们:

if(keys.length!=3)
//its not valid
if(!keys.contain("Address"))
//its not valid
.
.
.

以上是关于验证WCF Rest Service中Json对象的结构的主要内容,如果未能解决你的问题,请参考以下文章

Wcf Rest Service GET 方法无法显示 JSON 数据

尝试使用 json.net 和 WCF Rest Service 将 XML 转换为 JSON 输出时出现反斜杠问题

将 JSON 发送到 WCF Rest 服务 - 对象始终为空

WCF REST 服务流式传输 JSON 对象

WCF REST JSON 返回动态列表

2003 年使用 POST / JSON 托管 WCF Rest 服务