System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.ArgumentNullException

时间:2009-02-18 22:35:45

标签: c# web-services

我一直在收到错误:

System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.ArgumentNullException

当我尝试使用以下代码调用我的web服务时:

{
//Create an echoSync request - set the services.
ServiceNameType sourceService = new ServiceNameType {Service = "echoSync", OnBehalfOf = "Source"};
ServiceNameType destService = new ServiceNameType {Service = "echoSync", OnBehalfOf = "Destination"};

//Create the request.
SDD2RequestType request = new SDD2RequestType
                  {
                      AppId = "echoSync",
                      SourceService = sourceService,
                      DestService = destService,
                      RequestId = "1",
                      RequestBody = "Ping"
                  };

//Create the originator.
originator originator = new originator {id = "123456789"};

//Create the transport.
SDD2Transport transport = new SDD2Transport {originatorValue = originator};

//Send the request.
SDD2ResponseType response = null;
response = transport.SDD2TransportOp(request);

//Write out the response.
System.Console.WriteLine(response.ResponseBody.ToString());
}

我的网络服务方法很简单,看起来像这样:

    [System.Web.Services.Protocols.SoapHeaderAttribute("originatorValue", Direction = System.Web.Services.Protocols.SoapHeaderDirection.InOut)]
    [System.Web.Services.WebMethodAttribute()]
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://memberdirect.net/SDD2/Transport", RequestElementName = "SDD2Transport", RequestNamespace = "http://cucbc.com/sdd2/transport/", ResponseElementName = "SDD2TransportResponse", ResponseNamespace = "http://cucbc.com/sdd2/transport/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Default)]
    [return: System.Xml.Serialization.XmlElementAttribute("SDD2Response", Namespace = "http://cucbc.com/sdd2/")]
    public override SDD2ResponseType SDD2TransportOp(SDD2RequestType SDD2Request)
    {
        if (SDD2Request == null) throw new ArgumentNullException("SDD2Request");
        var response = new SDD2ResponseType();

        switch (SDD2Request.AppId)
        {
            case "echoSync":
                response.AppId = SDD2Request.AppId;
                response.ProcessingStatus = ProcessingStatusType.Complete;
                response.RequestId = SDD2Request.RequestId;
                response.ResponseBody = "Pong";
                break;
            default:
                throw new System.NotImplementedException();
                break;
        }

        return response;
    }

当我拨打电话时,我知道请求不是NULL,但是当它到达webservice时,它总是被接收为null。我使用wsdl.exe实用程序从WSDL生成了web服务,显然我不了解SOAP的所有细节。还有其他人遇到过这个问题吗?

4 个答案:

答案 0 :(得分:1)

我不知道是什么原因造成的,所以这不是你问题的答案,而只是建议进一步研究这个问题

尝试使用嗅探器查看计算机之间发送的实际数据,并找出问题所在的一侧。我已成功使用Wireshark一次。

答案 1 :(得分:1)

我有同样的问题,虽然原因可能不同。当我在调试器中逐步执行代码时,方法参数从实例变为空。

对于记录,它是由RequestElementName与方法名称不同引起的。可能还有其他影响因素,但是当我从方法定义中删除RequestElementName属性或者使其与方法名称相同时,null参数的问题就消失了。

例如,您的代码具有RequestElementName =“SDD2Transport”和方法名称SDD2TransportOp。

现在我不知道为什么这应该是一个问题,特别是你也有:ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Default,而不是Wrapped,这意味着无论如何都不会使用ElementName。

我想知道这是否是.NET SOAP客户端协议类中的错误,因为发生的情况是,尽管在Web服务中调用了正确的方法(因为它在SOAP Action标头中被标识),但参数不会得到反序列化。

在我的情况下,我每次重新创建它时都必须编辑生成的C#类,以便删除RequestElementName属性。请注意,我无法控制源WSDL,因为它是由第三方提供的。

答案 2 :(得分:0)

我没有机会使用Wireshark作为Configurator建议,但我能够通过在解决方案资源管理器中更新Web引用来解决此问题。

在与它进行了一个多小时的摔跤之后找到这样一个简单的解决方案我感到有点懊恼但是我希望这篇帖子可以帮助那些人。

答案 3 :(得分:0)

“参数接收为空”几乎总是意味着服务器期望的限定名称与客户端发送的限定名称之间存在差异。 XML限定名称由命名空间和本地名称组成。这通常意味着命名空间在客户端是不正确的,尽管我已经看到一个与名称不同的报告。

无论如何,您已找到问题的第一解决方案 - “更新Web参考”。