Serialization 对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

我有一个OData控制器,希望对其输出的字符串字段进行编码。OData输出结果作为清晰数据发送回客户机,但我想在发送给客户机之前对它们进行加密

似乎最好的方法是使用定制的OData序列化程序或提要序列化程序来实现我的目标。但我不确定该自定义哪个类。重写某些方法或实现我自己定制的序列化类版本更好吗


感谢您的帮助。

找到一种方法。我是通过在的帮助下定制序列化程序来实现的。最终代码:

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)”或类似的东西。