【发布时间】:2013-03-24 06:15:49
【问题描述】:
要重现我看到的问题,使用 VS2010,创建一个空网站并添加一个带有代码隐藏的 Web 服务 (asmx)。
使用如下代码,两个webmethods都可以成功调用:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService {
[WebMethod]
public void Method1(int x) {
// i'm good
}
[WebMethod]
public string Method2(int x) {
return "it worked";
}
}
现在,如果我将方法 2 的参数更改为可空类型,它可以正常工作,但它会使方法 1 失败...
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService {
[WebMethod]
public void Method1(int x) {
// no changes made to this method, but it no longer works
}
[WebMethod]
public string Method2(int? x) {
return "it worked";
}
}
如果在调用服务时缺少参数,我以前见过这样的错误:
System.IndexOutOfRangeException:索引超出范围 大批。在 System.Web.Services.Protocols.HttpServerType..ctor(类型 类型)在 System.Web.Services.Protocols.HttpServerProtocol.Initialize() 在 System.Web.Services.Protocols.ServerProtocolFactory.Create(类型类型, HttpContext 上下文,HttpRequest 请求,HttpResponse 响应, 布尔值&中止处理)
此外,只有在第一个方法返回 void 时才会出现中断,所以这也可以正常工作:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService {
[WebMethod]
public string Method1(int x) {
return "works again";
}
[WebMethod]
public string Method2(int? x) {
return "it worked";
}
}
有什么想法吗?这发生在使用 3.5 和 4.0 作为目标框架时。
编辑:只是为了抢占这些方面的进一步答案/cmets...我不是在寻找关于最佳实践、替代解决方案、asmx 在服务领域中的位置、wcf 等方面的建议。这是我来的在调试旧版应用程序中的问题时,该问题不是我编写的,并且已经修复,我有兴趣找出我在此处概述的特定行为的原因。
【问题讨论】:
-
ASMX 是一项遗留技术,不应用于新开发。 WCF 应该用于 Web 服务客户端和服务器的所有新开发。一个提示:微软已经在 MSDN 上停用了ASMX Forum。
-
另外,我不相信 ASMX 支持可为空的参数。
-
谢谢,但这不是新开发,它是一个非常古老的应用程序。我将其提炼成一个简单的示例来说明问题。
-
可空参数在使用它的方法上运行良好。
-
精彩的发现。我被困在这个问题上太久了,我从来没有想过在类的顶部添加一个非 void 返回方法。