簡體   English   中英

System.Web.Services.Protocols.SoapException:服務器無法處理請求。 ---> System.ArgumentNullException

[英]System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.ArgumentNullException

我一直在收到錯誤:

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());
}

我的webservice方法很簡單,看起來像這樣:

    [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的所有細節。 還有其他人遇到過這個問題嗎?

我有同樣的問題,雖然原因可能不同。 當我在調試器中逐步執行代碼時,方法參數從實例變為空。

對於記錄,它是由RequestElementName與方法名稱不同引起的。 可能還有其他影響因素,但是當我從方法定義中刪除RequestElementName屬性或者使其與方法名稱相同時,null參數的問題就消失了。

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

現在我不知道為什么這應該是一個問題,特別是因為你也有:ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Default,而不是Wrapped,這意味着無論如何都不會使用ElementName。

我想知道這是否是.NET SOAP客戶端協議類中的錯誤,因為發生的事情是盡管在Web服務中調用了正確的方法(因為它在SOAP Action標頭中被標識),但參數不會被反序列化。

在我的情況下,我每次重新創建它時都必須編輯生成的C#類,以便刪除RequestElementName屬性。 請注意,我無法控制源WSDL,因為它是由第三方提供的。

我不知道是什么原因造成的,所以這不是你問題的答案,而只是建議一種方法來進一步研究問題

嘗試使用嗅探器查看機器之間發送的實際數據,並找出問題所在的一側。 我成功使用過Wireshark一次。

我沒有機會使用Wireshark作為Configurator建議但我能夠通過在解決方案資源管理器中更新Web引用來解決此問題。

在與它進行了一個多小時的摔跤之后找到這樣一個簡單的解決方案我有點懊惱但我希望這篇文章可以幫助那些人。

“參數接收為空”幾乎總是意味着服務器期望的限定名稱與客戶端發送的限定名稱之間存在差異。 XML限定名稱由命名空間和本地名稱組成。 這通常意味着命名空間在客戶端是不正確的,雖然我已經看到一個與名稱不同的報告。

在任何情況下,您都找到了問題的第一解決方案 - “更新Web參考”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM