【问题标题】:Error WebService ASMX with different return types具有不同返回类型的错误 WebService ASMX
【发布时间】:2017-11-03 03:30:18
【问题描述】:

我在 ASMX Web 服务中有两种方法,如下所示:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[ScriptService]
public class TestWs: WebService
{
    [WebMethod(EnableSession = true)]
    [ScriptMethod(UseHttpGet = false)]
    public void Method_1()
    {
        //Do Something
    }

    [WebMethod(EnableSession = true)]
    [ScriptMethod(UseHttpGet = false)]
    public long Method_2(ParameterClass paramClass)
    {
        return 0;
    }
}

当我尝试使用 AJAX 调用其中一种方法时,它返回以下错误:

System.IndexOutOfRangeException:索引超出了数组的范围。
在 System.Web.Services.Protocols.HttpServerType..ctor(类型类型)
在 System.Web.Services.Protocols.HttpServerProtocol.Initialize()
在 System.Web.Services.Protocols.ServerProtocolFactory.Create(类型类型、HttpContext 上下文、HttpRequest 请求、HttpResponse 响应、Boolean& abortProcessing)

但是当我将 Method_2 的返回类型更改为 void 时,一切正常。 为什么会这样?如何在不更改返回类型的情况下修复它?


更新 这两种方法之间还有另一个区别:一种接收类作为参数,另一种不接收任何参数。当我从 Method_2 中删除参数时,它也可以工作。

更新 2 我将 Method_2 更改为:

[WebMethod(EnableSession = true)]
[ScriptMethod(UseHttpGet = false)]
public long Method_2(string paramString)
{
    ParameterClass pClass = (new JavaScriptSerializer()).Deserialize<ParameterClass>(paramString);
    //Do Something.
    return 0;
}

它是这样工作的,但我仍然不知道它为什么会发生。

【问题讨论】:

  • 这个错误的堆栈跟踪是什么?哪条线抛出它?
  • 它现在就在那里。我编辑问题

标签: c# asp.net web-services asmx


【解决方案1】:

看来这篇文章可能会对您有所帮助,将复杂的参数作为 Web 服务的输入会带来问题。

Passing a Complex Type as a Parameter to an ASMX Service

【讨论】:

  • 我发现的唯一解决方案是使用 SOAP,或者为了避免这种情况,我只是按照我在更新 2 中所写的操作。但我不明白为什么会这样。
  • MSDN 不再维护 ASMX 的文档,但是 webmethod 只是不允许复杂类只允许本地类型。很可能是由于该对象的序列化。 Here's WebMethods 上的 MSDN 文档。
  • 如果 webmethods 不允许复杂类,为什么当我将返回类型更改为 void 而不是 long (或任何其他类型)时,一切正常(除了我需要在我的 JS 上使用 webmethod 返回值) ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多