我试图通过采用可以为空的几个方法/属性来简化在winform和webapp(由其他人编写)之间共享的库中的一些代码,但是从来没有在/ null中传递可空值的值进入不可空的。
这在winform应用程序中运行良好,并且webapp没有任何编译时间问题,但是当我第一次运行它时,它报告错误,它无法找到所采用的方法的旧版本{{ 1}}参数,尽管传递的值是不可为空的DateTime?
s。当我添加了带有DateTime
参数的重载时,由于属性已从DateTime?
更改为int?
,因此仅在代码中的其他位置生成错误。
在确认带有int
参数的重载可以作为修复工作之后,我对重载进行了评论,试图找出它为什么坚持调用该版本。在某些时候我正在摆弄它(做强制重建等),它突然停止生成错误,即使我将两个.cs文件还原到它们最初失败的版本。此时它正在运行,但我不知道最初出了什么问题或者它是如何修复的,而且我非常谨慎地继续,直到我知道发生了什么。
近似错误消息(来自内存):
DateTime?
实际错误讯息:
Method not found: 'null
NameSpace.StaticClass.StaticMethod( IFoo foo, IBar[] bar, DateTime? padStart, DateTime? padEnd )'.
1 NameSpace.OtherClass.get_Number()'。`
MyWebService.asmx中的方法:
Method not found: 'System.Nullable
StaticClass中的方法:
[WebMethod( EnableSession = true )]
public string DoStuff( string jsonFoo, string startDate, string endDate )
{
try
{
IFoo foo = Deserialize<IFoo>( jsonFoo );
IBar[] bar = null;
DateTime padStart = DateTime.Parse(startDate);
DateTime padEnd = DateTime.Parse(endDate);
StaticClass.StaticMethod( foo, bar, padStart, padEnd );
}
}
答案 0 :(得分:1)
为了首先清除明显的问题 - 您是否重建了针对该服务构建的任何客户端代理/存根?客户端代码仍然可以生成对v1服务定义的服务请求,而不是闪亮的新v2服务请求。只是一个想法?
答案 1 :(得分:1)
听起来这只是.NET运行时如何在网站项目中处理动态编译的问题。在Web应用程序中,您必须在进行更改时重建它,并将整个应用程序编译为.dll,就像其他项目一样。在具有动态编译的网站中,运行时基本上决定了页面如何分成.dll以及何时需要重建。由于您的情况涉及静态方法,听起来像是一个单独的项目/ .dll,但您站点中的页面从未更改过,运行时可能只是从未重新链接到更新的.dll。然后,如果在某个时候你对页面进行了更改,导致它被重新编译,它会突然识别静态类中的新方法。当然,在这一点上,它只是在猜测;)
如果您再遇到这样的问题,我建议您在解决方案资源管理器中右键单击网站并执行“重建”