15

要重新创建我看到的问题,使用 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 等的建议。这是我在调试时遇到的东西遗留应用程序中的一个问题,我没有编写并且已经修复,我有兴趣找出我在此处概述的特定行为的原因。

4

4 回答 4

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)
    {

    }
}
于 2013-11-14T06:55:31.320 回答
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);
        }
    }
}
于 2014-04-10T07:14:10.300 回答
0

它可能发生的原因可能是您尝试将相同的 X 发送到这两种方法,尽管它们没有采用相同的类型?

因为一个是可以为空的,而另一个不是。

于 2014-03-05T06:02:54.197 回答
-1

有必要Nullable (?)在您的解决方案中使用吗?我认为您可以实现一个非常简单的逻辑,例如:“如果我收到一个空字符串,那么我有一个 Null 值,或者如果我收到一个“Null”字符串值,那么我需要使用一个 Null 对象”,并且将来考虑使用 WCF 的Nullable-?方法。

另一方面,我建议您将所有 void 方法更改为带有 word 的字符串值"ok"。我认为“一个请求应该有一个响应”。

于 2013-04-02T23:52:39.150 回答