扩展OData解串器

时间:2015-03-05 12:33:52

标签: c# asp.net asp.net-web-api odata

我正在使用ASP.NET Web API实现OData v3 API端点。

我注意到我的Web API中的CreateLink方法仅在客户端为现有条目执行SetLink时调用。

另一方面,如果我使用链接(SetLink)创建新条目,则不会调用Web API上的CreateLink。相反,链接包含在创建实体的POST请求中:

<?xml version=\"1.0\" encoding=\"utf-8\"?>
    <entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:d=\"http://schemas.microsoft.com/ado/2007/08/dataservices\" xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\">
        <category term=\"TestProject.Entities.TestEntity\" scheme=\"http://schemas.microsoft.com/ado/2007/08/dataservices/scheme\" />
        <link rel=\"http://schemas.microsoft.com/ado/2007/08/dataservices/related/TestEntityChild\" type=\"application/atom+xml;type=entry\" title=\"TestEntityChild\" href=\"http://localhost:18995/odata/TestEntityChildren(2)\" />
        <id />
        <title />
        <updated>2015-03-05T08:28:05Z</updated>
        <author>
            <name />
        </author>
        <content type=\"application/xml\">
            <m:properties>
                <d:Id m:type=\"Edm.Int32\">0</d:Id>
                <d:OtherProperty m:type=\"Edm.Int32\" m:null=\"true\" />
            </m:properties>
        </content>
    </entry>

如何将此链接绑定到传递给我的ODataController操作的模型?

我的第一个想法是扩展OData解串器。由于ODataEntityDeserializer是内部类,我无法这样做。也许有一些更简单的方法?

1 个答案:

答案 0 :(得分:0)

您可以通过在WebAPIConfig.cs中添加格式化程序来扩展odata反序列化。

    public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        HttpServer APIServer = new HttpServer(config);

        config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
        config.Formatters.JsonFormatter.MaxDepth = 2048;
        config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

        config.Services.Replace(typeof(IExceptionHandler), new CustomExceptionHandler());
        var odataFormatters = ODataMediaTypeFormatters.Create(new ODataSerialzer(), new ODataDeserialzer());
        config.Formatters.Clear();
        config.Formatters.AddRange(odataFormatters);

        config.MapODataServiceRoute(routeName: "OData",
            routePrefix: "",
            model: APIConfiguration.GetModel(),
            batchHandler: new DefaultODataBatchHandler(APIServer));
    }

}