[英]Error when generating help page webapi2
I am getting an error when trying to generate a help page using MVC5 web api2, I know that when generating the project it generates this for you, however I am getting errors now when trying to click on a link尝试使用 MVC5 web api2 生成帮助页面时出现错误,我知道在生成项目时它会为您生成此内容,但是现在尝试单击链接时出现错误
System.StackOverflowException was unhandled
System.StackOverflowException 未处理
The error happens on this line formatter.WriteToStreamAsync(type, value, ms, content, null).Wait();
错误发生在这一行
formatter.WriteToStreamAsync(type, value, ms, content, null).Wait();
and this is the code where it is happening.这就是它发生的代码。
[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "The exception is recorded as InvalidSample.")]
public virtual object WriteSampleObjectUsingFormatter(MediaTypeFormatter formatter, object value, Type type, MediaTypeHeaderValue mediaType)
{
if (formatter == null)
{
throw new ArgumentNullException("formatter");
}
if (mediaType == null)
{
throw new ArgumentNullException("mediaType");
}
object sample = String.Empty;
MemoryStream ms = null;
HttpContent content = null;
try
{
if (formatter.CanWriteType(type))
{
ms = new MemoryStream();
content = new ObjectContent(type, value, formatter, mediaType);
formatter.WriteToStreamAsync(type, value, ms, content, null).Wait();
ms.Position = 0;
StreamReader reader = new StreamReader(ms);
string serializedSampleString = reader.ReadToEnd();
if (mediaType.MediaType.ToUpperInvariant().Contains("XML"))
{
serializedSampleString = TryFormatXml(serializedSampleString);
}
else if (mediaType.MediaType.ToUpperInvariant().Contains("JSON"))
{
serializedSampleString = TryFormatJson(serializedSampleString);
}
sample = new TextSample(serializedSampleString);
}
else
{
sample = new InvalidSample(String.Format(
CultureInfo.CurrentCulture,
"Failed to generate the sample for media type '{0}'. Cannot use formatter '{1}' to write type '{2}'.",
mediaType,
formatter.GetType().Name,
type.Name));
}
}
catch (Exception e)
{
sample = new InvalidSample(String.Format(
CultureInfo.CurrentCulture,
"An exception has occurred while using the formatter '{0}' to generate sample for media type '{1}'. Exception message: {2}",
formatter.GetType().Name,
mediaType.MediaType,
UnwrapException(e).Message));
}
finally
{
if (ms != null)
{
ms.Dispose();
}
if (content != null)
{
content.Dispose();
}
}
return sample;
}
I got the exact same behavior on a web api project, specifically on a method that received an object as input parameter. 我在web api项目上得到了完全相同的行为,特别是在接收对象作为输入参数的方法上。 For example:
例如:
public IHttpActionResult Post(Person person)
The error started showing up after I added a class with the same name (Person) on another unrelated namespace, so the error disappeared by referencing the parameter with the fully qualified namespace: 在我在另一个不相关的命名空间上添加了一个具有相同名称(Person)的类后,错误开始显示,因此通过使用完全限定的命名空间引用参数,错误消失了:
public IHttpActionResult Post(MyProject.Models.Person person)
Hope this helps someone out. 希望这有助于某人。
This may happen if you have a self referencing loop, for some property (or child property) of the parameter object value
for which the help page is trying to generate a sample.如果您有一个自引用循环,对于帮助页面试图为其生成示例的参数
object value
的某些属性(或子属性),可能会发生这种情况。 One way to find out which property is self referencing is by setting a break point here inside the catch scope找出哪个属性是自引用的一种方法是在 catch scope 中设置一个断点
catch (Exception e)
{
sample = new InvalidSample(String.Format(
CultureInfo.CurrentCulture,
"An exception has occurred while using the formatter '{0}' to generate sample for media type '{1}'. Exception message: {2}",
formatter.GetType().Name,
mediaType.MediaType,
UnwrapException(e).Message));
}
Note: Since the XmlMediaTypeFormatter throws System.StackOverflowException
which cannot be caught , This breakpoint will NOT trigger for XmlMediaTypeFormatter, but it will trigger for the JSON formatter.注意:由于 XmlMediaTypeFormatter 抛出
System.StackOverflowException
无法捕获,因此该断点不会为 XmlMediaTypeFormatter 触发,但会为 JSON 格式化程序触发。
The JSON formatter should give a message in the following format: Self referencing loop detected for property 'SomeProperty' with type 'SomeAssembly.Test.SomeModel'. JSON 格式化程序应以以下格式给出消息:检测到类型为“SomeAssembly.Test.SomeModel”的属性“SomeProperty”的自引用循环。 Path 'SomeProperty.SomeChildProperty'.
路径“SomeProperty.SomeChildProperty”。
To find a solution to this problem, if you cannot remove the circular reference from the model in question, see Handling Circular Object References from this article https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/json-and-xml-serialization#handling_circular_object_references要找到此问题的解决方案,如果您无法从有问题的 model 中删除循环引用,请参阅处理循环 Object 引用本文Z5E056C500A1C4B6A7110B50D807BADE.com/docs.api//overview-us/asp.com /formats-and-model-binding/json-and-xml-serialization#handling_circular_object_references
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.