要重新创建我所看到的问题,使用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上的parm更改为可空类型它可以正常工作,但它会使方法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 输入) System.Web.Services.Protocols.HttpServerProtocol.Initialize()at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext上下文,HttpRequest请求,HttpResponse响应, 布尔和放大器; 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等方面的建议。这是我来的调试遗留应用程序中的一个问题,我没有编写,哪些已经修复,我有兴趣找到我在这里概述的特定行为的原因。
答案 0 :(得分:1)
@heisenberg,你从调用web方法的应用程序传递null吗? 我试过的样本在vs2010上运行正常。在它下面是我试过的代码。
示例代码:
protected void Button1_Click(object sender, EventArgs e)
{
WebService1 objws = new WebService1();
objws.voidMethod(5);
Label1.Text = objws.HelloWorld(5);
}
服务ASMX代码
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld(int? x)
{
if (x != null)
{
return x.ToString();
}
return "Hello World";
}
[WebMethod]
public void voidMethod(int x)
{
}
}
答案 1 :(得分:1)
我尝试了你的代码并且它正在运行。虽然调试不起作用,但会产生错误。
我认为它正在发生,因为Nullable int不是原始类型。请参阅服务的WSDL描述“测试表单仅适用于具有基本类型作为参数的方法”。
我认为你面临的问题不是因为Nullable int。
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public void Method1(int x)
{
// i'm good
}
[WebMethod]
public string Method2(int? x)
{
return "it worked";
}
}
网站代码:
namespace Helper
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ServiceReference1.WebService1SoapClient web = new ServiceReference1.WebService1SoapClient();
web.Method1(5);
string x = web.Method2(5);
}
}
}
答案 2 :(得分:0)
它可能会发生原因可能是你试图将相同的X发送到这两种方法,虽然它们没有采用相同的类型?
因为一个可以为空,而另一个则不可以。
答案 3 :(得分:-1)
您的解决方案中是否需要使用Nullable (?)
?我认为你可以实现一个非常简单的逻辑,如:“如果我收到一个空字符串然后我有一个Null值或者如果我收到一个”Null“字符串值,那么我需要使用一个Null对象”并在将来考虑使用Nullable-?
方法使用WCF。
另一方面,我建议您使用单词"ok"
将所有void方法更改为字符串值。我认为“A请求应该有回应”。