要重新创建我看到的问题,使用 VS2010,创建一个空网站并添加一个带有代码隐藏的 Web 服务 (asmx)。
使用以下代码,可以成功调用两个 webmethod:
[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(Type type) 在 System.Web.Services.Protocols.HttpServerProtocol.Initialize() 在 System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest 请求、HttpResponse 响应、Boolean& abortProcessing)
此外,如果第一个方法返回 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 作为目标框架时。
编辑:只是为了抢占这些方面的进一步答案/评论......我不是在寻找关于最佳实践、替代解决方案、asmx 在服务环境中的位置、wcf 等的建议。这是我在调试时遇到的东西遗留应用程序中的一个问题,我没有编写并且已经修复,我有兴趣找出我在此处概述的特定行为的原因。