2009-02-18 398 views
3

我一直在收到錯誤:System.Web.Services.Protocols.SoapException:服務器無法處理請求。 ---> 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()); 
} 

我的web服務方法十分簡單,它看起來像這樣:

[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,但當它到達web服務時,它總是被接收爲空。我使用wsdl.exe實用程序從WSDL生成webservice,顯然我不明白我應該使用的所有SOAP細節。有其他人遇到這個問題嗎?

回答

1

我不知道是什麼原因導致,所以這是不是一個回答你的問題,但只有一種方式的建議,以進一步調查該問題

嘗試使用嗅探器來看看實際的數據被髮送在機器之間找出問題出在哪一邊。我已經成功使用Wireshark一次。

+0

我真的很喜歡Wireshark的想法。我正在使用ASP.NET開發服務器進行調試,所以一切都是本地的,但我會試一試。 乾杯; Dave – Daver 2009-02-18 23:04:21

0

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

我已經找到了這樣一個簡單的解決方案後,與它搏鬥了一個多小時,但我希望這篇文章可以幫助那裏的人有點懊惱。

0

「參數被接收爲空」幾乎總是意味着服務器期望的限定名與客戶端發送的限定名之間存在差異。 XML限定名稱由名稱空間加上本地名稱組成。這通常意味着名稱空間在客戶端不正確,儘管我已經看到一個與名稱不同的報告。

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

1

我有同樣的問題,雖然原因可能會有所不同。當我在調試器中遍歷我的代碼時,方法參數從一個實例變爲null。

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

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

現在我不知道爲什麼這應該是一個問題,尤其是因爲你也有:ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Default,沒有包裝,這意味着ElementName將不會被使用。

我不知道這是否是.NET SOAP客戶端協議類中的一個錯誤,因爲發生的是雖然在Web服務中調用了正確的方法(因爲它在SOAP Action頭中標識),但參數不會得到反序列化。

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

相關問題