0

我在我的启动类中使用以下代码来防止序列化我的实体的错误,这可能导致循环引用,但它不起作用。

为什么?

public partial class Startup
    {
        public static void ConfigureMobileApp(IAppBuilder app)
        {

            HttpConfiguration config = new HttpConfiguration();

            new MobileAppConfiguration()
                .UseDefaultConfiguration()
                .ApplyTo(config);

            config.MapHttpAttributeRoutes();

            // Use Entity Framework Code First to create database tables based on your DbContext
            Database.SetInitializer(new MobileServiceInitializer());
            MobileAppSettingsDictionary settings = config.GetMobileAppSettingsProvider().GetMobileAppSettings();

            config.Formatters.JsonFormatter.SerializerSettings.Re‌​ferenceLoopHandling = ReferenceLoopHandling.Ignore;

            config.Services.Add(typeof(IExceptionLogger), new AiExceptionLogger());

            if (string.IsNullOrEmpty(settings.HostName))
            {
                app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions
                {
                    // This middleware is intended to be used locally for debugging. By default, HostName will
                    // only have a value when running in an App Service application.
                    SigningKey = ConfigurationManager.AppSettings["SigningKey"],
                    ValidAudiences = new[] { ConfigurationManager.AppSettings["ValidAudience"] },
                    ValidIssuers = new[] { ConfigurationManager.AppSettings["ValidIssuer"] },
                    TokenHandler = config.GetAppServiceTokenHandler()
                });
            }

            app.UseWebApi(config);
        }
    }
4

1 回答 1

0

根据您的描述,我创建了我的 Azure 移动应用项目来测试这个问题。根据您的Startup.cs,我添加apiController如下:

[MobileAppController]
public class ValuesController : ApiController
{
    [Route("api/values")]
    public HttpResponseMessage Get()
    {
        Department sales = new Department() { Name = "Sales" };
        Employee alice = new Employee() { Name = "Alice", Department = sales };
        sales.Manager = alice;
        return Request.CreateResponse(sales);
    }
}

public class Employee
{
    public string Name { get; set; }
    //[JsonIgnore]
    public Department Department { get; set; }
}

public class Department
{
    public string Name { get; set; }
    public Employee Manager { get; set; }
}

访问此端点时,我遇到了以下 XML 循环对象引用错误:

在此处输入图像描述

注意:为了简单起见,我通过config.Formatters.Remove(config.Formatters.XmlFormatter);. 此外,您可以参考处理循环对象引用中关于在 XML 中保留对象引用的部分。

删除 XML Formatter 后,我遇到以下关于 JSON 中对象引用循环的错误:

在此处输入图像描述

然后,我在 Web API 代码示例中遵循了这个循环引用处理,但最终没有运气。此外,我尝试创建一个新的 Web API 项目,发现它ReferenceLoopHandling.Ignore可以按预期工作。

最后,我发现如果我MobileAppController从我的 中删除该属性 apiController,那么它可以按如下方式工作:

在此处输入图像描述

总之,我假设您可以尝试使用JsonIgnore for JSON.NET 忽略引用属性,有关更多详细信息,您可以参考fix 3:Ignore 并保留引用属性

于 2017-05-12T09:32:17.117 回答