为了复现我所看到的问题,请使用VS2010创建一个空网站,并添加一个带有代码后台的Web服务(asmx)。
使用以下代码,两个Web方法均可以成功调用:
[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) 中 at System.Web.Services.Protocols.HttpServerProtocol.Initialize() 在 System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, 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等方面的建议。这是在调试一个我没有编写并且已经被修复的旧应用程序中遇到的问题,我有兴趣找出我在这里概述的特定行为的原因。