2015-07-28 93 views
2

我有一個運行SAP系統的客戶端,我的任務是通過Web服務將我們的系統連接到SAP系統。客戶端提供了WSDL文件,我從中生成了相應的C#代碼,我將按如下方式調用:Webservice連接被取消

Service service = new Service(); 
service.Url = "myUrl"; 
service.Credentials = new NetworkCredential("user", "pw"); 
ServiceResponse result = new ServiceResponse(); 
try 
{ 
    result = service.MyOperation(myData); 
    Console.WriteLine("Result.EfReturn {1}, Result.EtMess[0].Message {2}", result.EvReturn, result.EtMess[0].Message); 
} 
catch (System.Exception ex) 
{ 
    Console.WriteLine("Exception:\n" + ex.ToString()); 
} 

這一般適用。但是,每過一段時間(比如:每200個請求左右,有時更經常)我得到一個異常:

System.Net.WebException: Die Anfrage wurde abgebrochen: Die Anfrage wurde abgebrochen.. 
    bei System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request) 
    bei System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request) 
    bei System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) 
    bei WebServices.WebService_SAP.service.MyOperation(MyData myData) in c:\Users\cso\Desktop\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1\ServiceTest.cs:Zeile 54. 

奇怪的是,使用了SoapUI時,這種情況不會發生,但我得到驗證對於每一個請求錯誤(這似乎不影響結果,雖然) - 日誌輸出看起來是這樣的:

Wed Jul 22 11:19:18 CEST 2015:DEBUG:Connection can be kept alive indefinitely 
Wed Jul 22 11:19:18 CEST 2015:DEBUG:Stale connection check 
Wed Jul 22 11:19:18 CEST 2015:DEBUG:Attempt 1 to execute request 
Wed Jul 22 11:19:18 CEST 2015:DEBUG:Sending request: POST /some/service/binding HTTP/1.1 
Wed Jul 22 11:19:18 CEST 2015:DEBUG:Receiving response: HTTP/1.1 401 Unauthorized 
Wed Jul 22 11:19:18 CEST 2015:DEBUG:Connection can be kept alive indefinitely 
Wed Jul 22 11:19:18 CEST 2015:DEBUG:Target requested authentication 
Wed Jul 22 11:19:18 CEST 2015:DEBUG:Authorization challenge processed 
Wed Jul 22 11:19:18 CEST 2015:DEBUG:Authentication scope: BASIC 'SAP NetWeaver Application Server [TSE/881]'@somedomain:8033 
Wed Jul 22 11:19:18 CEST 2015:INFO:somedomain:8033 requires authentication with the realm 'SAP NetWeaver Application Server [TSE/881]' 
Wed Jul 22 11:19:18 CEST 2015:DEBUG:Found credentials 
Wed Jul 22 11:19:18 CEST 2015:DEBUG:Attempt 2 to execute request 
Wed Jul 22 11:19:18 CEST 2015:DEBUG:Sending request: POST /some/service/binding HTTP/1.1 
Wed Jul 22 11:19:19 CEST 2015:DEBUG:Receiving response: HTTP/1.1 200 OK 

對於我這個樣子了SoapUI只是再次嘗試,然後第二個請求工作。

所以我想,我的問題是:

  1. 有沒有人見過這樣的行爲?你是如何克服它的?
  2. 我的問題可能與我在SoapUI中看到的身份驗證問題有關嗎?
  3. 如何調試這樣的問題?
+0

當你得到'HTTP/1.1 401 Unauthorized'時,入站響應頭中沒有'challange header'? –

+1

當使用SoapUI是正確的時候,初始'401'是正確的 - 這就是http基本認證的工作方式。客戶端不知道需要身份驗證,因此它在不提供用戶名/密碼的情況下執行'POST',服務器用'401'做出響應,然後客戶端再次嘗試,這次提供用戶名/密碼並且'POST'成功。您可以通過勾選* Pre-emptive auth *複選框來阻止它在SoapUI中的使用。 – mjturner

+0

@mjturner:謝謝你的解釋。你認爲這可能與我的一般問題有關嗎?我注意到服務對象有一個名爲PreAuthenticate的布爾標誌,它可能和你提到的SoapUI選項一樣... – csoltenborn

回答

0

解決方案是重新生成客戶端的web服務代碼。我們之前使用MS的Wsdl.exe工具生成了代碼;從Visual Studio(Add/Service Reference)內部重新生成後,生成的代碼(似乎使用更新的WS框架)效果更好。我們很少看到像問題中提到的錯誤。