我有一个使用JSON消息与客户端通信的web服务,运行时本身并不知道数据模型,这就是为什么我使用json.net Schema来验证来自客户端和服务本身内部的消息,但是它在性能方面造成了大量的开销。
简化的代码,仍然包含足够的上下文来理解我在做什么。
public class Template
{
/// <summary>
/// Template known as
/// </summary>
public string Name { get; private set; }
/// <summary>
/// Razor Template
/// </summary>
public string RazorTemplate { get; private set; }
/// <summary>
/// Json Schema definition
/// </summary>
public string Schema { get; private set; }
private JSchema _schema { get; set; }
private JSchema JSchema
{
get
{
if (_schema == null)
_schema = JShema.Parse(Schema);
return _schema;
}
}
private void Validate(JObject obj)
{
// Schema validation Error messages.
IList<string> ValidationError;
// Schema validation.
if (!obj.IsValid(JSchema, out ValidationError))
{
throw new Exception(string.Join(",", ValidationError.ToArray()));
}
}
public string RunTemplate(JObject jobj)
{
// Validate Json Object.
Validate(jobj);
// Code here that access our RazorEngine cache, and add then run Razor Template, or directly run a cached Razor Template...
return "Here we return string generated by RazorEngine to sender.";
}
}
假设我运行一个简单的"Hello @Model.Name!"模板来验证json是否有字符串名称,这是的15-20倍,如果我完全注释掉验证。
是否有更有效的方法在Json中使用IsValid。网络模式?
确保更新到最新版本的Json。. NET模式在NuGet上可用,当使用旧版本验证某些模式时性能很慢。
还有关于Json的文档。. NET Schema网站的性能最佳实践。