Serialization 对OData输出中的字符串字段进行编码
我有一个OData控制器,希望对其输出的字符串字段进行编码。OData输出结果作为清晰数据发送回客户机,但我想在发送给客户机之前对它们进行加密 似乎最好的方法是使用定制的OData序列化程序或提要序列化程序来实现我的目标。但我不确定该自定义哪个类。重写某些方法或实现我自己定制的序列化类版本更好吗Serialization 对OData输出中的字符串字段进行编码,serialization,asp.net-web-api,odata,Serialization,Asp.net Web Api,Odata,我有一个OData控制器,希望对其输出的字符串字段进行编码。OData输出结果作为清晰数据发送回客户机,但我想在发送给客户机之前对它们进行加密 似乎最好的方法是使用定制的OData序列化程序或提要序列化程序来实现我的目标。但我不确定该自定义哪个类。重写某些方法或实现我自己定制的序列化类版本更好吗 感谢您的帮助。找到一种方法。我是通过在的帮助下定制序列化程序来实现的。最终代码: using Microsoft.Data.Edm; using Microsoft.Data.OData; using
感谢您的帮助。找到一种方法。我是通过在的帮助下定制序列化程序来实现的。最终代码:
using Microsoft.Data.Edm;
using Microsoft.Data.OData;
using System.Web.Http.OData.Formatter.Serialization;
namespace MyProj
{
public class CustomODataEntityTypeSerializer : ODataEntityTypeSerializer
{
public CustomODataEntityTypeSerializer(ODataSerializerProvider serializerProvider) : base(serializerProvider)
{
}
public override void WriteObjectInline(object graph, IEdmTypeReference expectedType, ODataWriter writer, ODataSerializerContext writeContext)
{
//http://odata.github.io/WebApi/#06-03-costomize-odata-formatter
if (graph is CompanyDto)
{
var company = (CompanyDto)graph;
company.FirstName = Encrypt(company.FirstName);
company.LastName = Encrypt(company.LastName);
}
base.WriteObjectInline(graph, expectedType, writer, writeContext);
}
}
}
这门课:
using Microsoft.Data.Edm;
using System.Web.Http.OData.Formatter.Serialization;
namespace MyProj
{
public class CustomDefaultODataSerializerProvider : DefaultODataSerializerProvider
{
CustomODataEntityTypeSerializer _customODataEntityTypeSerializer;
public CustomDefaultODataSerializerProvider()
{
_customODataEntityTypeSerializer = new CustomODataEntityTypeSerializer(this);
}
public override ODataEdmTypeSerializer GetEdmTypeSerializer(IEdmTypeReference edmType)
{
if (edmType.IsEntity())
{
return _customODataEntityTypeSerializer;
}
return base.GetEdmTypeSerializer(edmType);
}
}
}
并按如下方式初始化它:
var odataFormatters = ODataMediaTypeFormatters.Create(new CustomDefaultODataSerializerProvider(), new DefaultODataDeserializerProvider());
config.Formatters.InsertRange(0, odataFormatters);
只需使用HTTPS,所有数据和字符串都将被加密。如果您自己进行加密,您将如何保护密钥(保密并在客户端和服务器之间共享)?此处不提供HTTPS选项。客户端不能看到数据。客户端上的进程将解密数据。我同意密钥将在客户端可执行文件中,并且可以找到。但应用程序只在少数应该具备黑客技能的地方使用。如何将数据的“加密”版本存储在OData属性中,而不是与序列化程序混为一谈?@MarvinSmit如何做到这一点?抱歉,不理解您的解决方案。请在您的实体上创建2个属性。1个OData外露,1个内部。内部一个保存未加密的数据。ODataOne在get上使用“returnencrypt(internal):”在set上使用“internal=Decrypt(value)”或类似的东西。