Compartir a través de


当你有所疑虑时,请启用跟踪功能

[原文发表地址]  When in doubt, turn on Tracing

[原文发表时间] January 1, 2013 12:38 AM

在我的博客中,我最喜欢的一篇是“互联网不是一个黑盒。看看其本质。

我一直想要鼓励大家去“黑盒”里面看看——或者更具体点说,当它被人们看作是个黑盒时——请尝试解决人们的疑虑。

我博客的读者Eddie F向我提出了一个好问题。他知道我惜字如金, 因此他提到如果我回答了他的问题, 我可以把最终结果放到博客中去。向Eddie致敬。

他说:

    我有一个使用了Entity Framework 5.0实体的例子,如果我添加了 [ 必需 ] [Required] )数据注释到我的实体类属性中,它会拒绝“放入“( PUT) 到我的ASP.NET WebApi 控件里(全部使用 .NET 4.5 RTM ),这着实让我觉得奇怪。

我们知道Eddie有一个实体,它的属性中包含一个[必需]属性。当他进行放入操作(PUT)(而不是POST操作)时会得到一个报错信息:

var response = client.PutAsJsonAsync("/api/MagicPants/Update", entry).Result;
//HERE IS THE POINT OF FAILURE when the [Required] attribute
// is added to the EF poco type PortfolioEntry.

如果删除了这个[必需]属性,则没有这个问题。如果他使用任何其他的DataAnnotation,如RangeValidation,也没有这个问题。

Eddie指出他曾经使用Google(以及Bing)试图找寻答案,但是却一无所获。在问我之前他也问过很多朋友和StackOverFlow。很值得思考的问题。

我这样回复他,想获得更多信息。

底层发生了什么事情?你在描述一个与黑盒的交互,但没有推送……跟踪调查的结果怎样?Fiddler是怎么说的?

https://blogs.msdn.com/b/henrikn/archive/2012/08/15/asp-net-web-api-released-and-a-preview-of-what-s-next.aspx

Eddie回复:

  这个问题,你提供给我的Henrik的博客链接(书签 已查看)让我发现了网络API的跟踪功能。你简直就是个天才!我之前感觉自己寸步难行,但是现在我觉得如履平地。非常感谢你!

作为一个ASP.NET人员,我举这个例子是想说Tracing(跟踪)在产品中并不容易发现。然而,一旦你知道了它的存在(贯通整个ASP.NET),一切将变得有意思起来。在你解密它的强大之前,你需要懂得向跟踪(还有Google)寻求答案。大部分产品都有跟踪或者日志记录或者“开启诊断到第11步。”

Eddie说:

跟踪给了他非常清楚的答案:

iisexpress.exe Error: 0 : Operation=FormatterParameterBinding.ExecuteBindingAsync,
Exception=System.InvalidOperationException:
Property 'OrderOfMagnitude' on type 'TFSPortfolio.Models.PortfolioEntry' is invalid.
Value-typed properties marked as [Required] must also be marked with
[DataMember(IsRequired=true)] to be recognized as required.
Consider attributing the declaring type with [DataContract]
and the property with [DataMember(IsRequired=true)].
at System.Web.Http.Validation.Validators.ErrorModelValidator.Validate(ModelMetadata metadata, Object container)
...
at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken

我有这个DataMember属性,但是没有设置IsRequired=True

因此我添加了这个属性,然后一切就搞定了!

更妙的是,Eddie知道有关T4的事情,可以用于生成他的实体代码,因此他又说:

我又在T4模版上做了些小小的改动来全局领域修复这个问题 我已经爱上T4了。

一个非常好的解决方案,因为有了明确的关于某个问题的提问。当你有所疑虑时,请开启跟踪吧!