Проверка структуры объекта Json в WCF Rest Service - PullRequest
0 голосов
/ 29 сентября 2018

Я написал WCF Rest Service, где в методе 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"
}
}

Поскольку присутствует дополнительный элемент, он должен завершиться ошибкой (BadRequest).А также

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

}

По мере появления дополнительного "Нового" элемента, который должен провалиться (BadRequest).

Пожалуйста, помогите мне.Спасибо

1 Ответ

0 голосов
/ 30 сентября 2018

к сожалению, вы не можете сделать это с wcf.в веб-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
.
.
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...