gpt4 book ai didi

asp.net - 从 Web API 获取空的 500 http 状态代码

转载 作者:行者123 更新时间:2023-12-03 00:26:14 25 4
gpt4 key购买 nike

我的模型中有一个圆形对象图,但这是不可避免的。

根据 this article 中给出的建议,我已使用 DataContractAttribute 并在所有成员上设置 IsReference = true 。我还在我想要序列化的所有属性上提供了 DataMemberAttribute

为了确保序列化器不会再次遇到任何问题,我只选择序列化导航属性。

但是,我在 catch block 中仍然遇到异常。异常详情如下:

        _innerException: {"Type 
'System.Data.Entity.DynamicProxies.Author_615FB9F8BB22B55A7CA168DA5ED29EC6A0B59F62FD79D1346045351BE2F163A4' with data contract name
'Author_615FB9F8BB22B55A7CA168DA5ED29EC6A0B59F62FD79D1346045351BE2F163A4:
http://schemas.datacontract
.org/2004/07/System.Data.Entity.DynamicProxies' is not expected.
Consider using a
DataContractResolver or add any types not known statically to
the list of known types - for
example, by using the KnownTypeAttribute attribute or by adding them
to the list of known types
passed to DataContractSerializer."}

我可以但不希望:

1) 禁用代理创建。我可以为了序列化而删除代理创建,我可能会这样做。但我也想了解为什么我仍然遇到异常以及我可以采取什么措施。

2) 删除循环引用。原因:此类引用在 Entity Framework 生成的模型中非常常见。如果我要做一个模型中包含 800 - 1000 个类的大型项目,那么通过删除循环引用来实现它将是一场噩梦。

我在下面描述了这个小尖峰解决方案的架构元素。

数据库架构

Id  AuthorName
-------------------------------
1 Charles Dickens
2 Charles Petzold
3 Charles Darwin
4 Charles Chaplin
5 Leo Tolstoy
6 Fydor Dostoevsky
7 Ayn Rand
8 Napolean Hill
9 Claude M. Bristol
10 Edward Dwight Easty
11 O. Henry
12 William Shakespeare
13 Juwal Lowy
14 Jeffrey Richter
15 Chris Sells
16 Don Box
17 Steven Pinker
18 Jim Rohn
19 George Eliot
20 Sathyaish Chakravarthy



Id Title AuthorId
----------- -------------------------------------------------- -----------
1 Nicholas Nickleby 1


Id BookId Review
----------- ---------------------------------------------------------------
1 1 How do I know? I haven't read it.

型号

using System.Collections.Generic;
using System.Runtime.Serialization;

namespace BookReviewsModel
{
[DataContract(IsReference = true)]
public partial class Author
{
[DataMember]
public virtual int Id { get; set; }

[DataMember]
public virtual string AuthorName { get; set; }

public virtual ICollection<Book> Books { get; set; }
}
}


namespace BookReviewsModel
{
[DataContract(IsReference = true)]
public partial class Book
{
[DataMember]
public virtual int Id { get; set; }

[DataMember]
public virtual string Title { get; set; }

[DataMember]
public virtual int AuthorId { get; set; }

public virtual Author Author { get; set; }

public virtual ICollection<BookReview> BookReviews { get; set; }
}
}

namespace BookReviewsModel
{
[DataContract(IsReference = true)]
public partial class BookReview
{
[DataMember]
public virtual int Id { get; set; }

[DataMember]
public virtual int BookId { get; set; }

[DataMember]
[AllowHtml]
public virtual string Review { get; set; }

public virtual Book Book { get; set; }
}
}

Controller 代码

namespace BookReviews.Controllers
{
public class AuthorController : ApiController
{
[HttpGet]
public IEnumerable<Author> Index()
{
try
{
using (var context = new BookReviewEntities())
{
var authors = context.Authors.ToList();

var str = Serialize(new XmlMediaTypeFormatter(), authors);

System.Diagnostics.Debugger.Break();
System.Diagnostics.Debug.Print(str);

return authors;
}
}
catch (Exception ex)
{
var responseMessage = new HttpResponseMessage
{
Content = new StringContent("Couldn't retreive the list of authors."),
ReasonPhrase = ex.Message.Replace('\n', ' ')
};

throw new HttpResponseException(responseMessage);
}
}

string Serialize<T>(MediaTypeFormatter formatter, T value)
{
Stream stream = new MemoryStream();
var content = new StreamContent(stream);

formatter.WriteToStreamAsync(typeof(T), value, stream, content, null).Wait();

stream.Position = 0;
return content.ReadAsStringAsync().Result;
}
}
}

最佳答案

解决方案:

此问题已在 AspNetWebStack Nightly Build 中得到解决。

由于我正在跟进多个问题,因此我尚未确定哪个 checkin 可以纠正该行为。

您可以通过添加 http://www.myget.org/F/aspnetwebstacknightly/ 来更新您的解决方案以使用最新的夜间软件包。到您的包管理器配置,然后从这个附加存储库显式更新。

据我所知,1/18 nightly 在我的解决方案中是稳定的(odata 查询返回速度也快得多。)

解决方法:

如果您无法使用最新的 aspnetwebstack 版本,并且不需要 XML 格式的源,则有一个潜在的解决方法。

http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization

本文档展示了如何配置 web-api Controller 使用的格式化程序,还展示了如何处理循环引用,以及如何重新配置​​/替换默认的 xml 格式化程序。

作为解决方法,您可以在 Application_Start 期间删除 xml 格式化程序:

var xmlFormatter = config.Formatters.XmlFormatter;
if (xmlFormatter != null)
{
config.Formatters.Remove(xmlFormatter);
}

关于asp.net - 从 Web API 获取空的 500 http 状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14258427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com