2012-09-17 38 views
0

我的應用程序是使用WCF服務的C#Windows服務。當第一個「預期失敗(417)」錯誤,我改變都ServicePointManager.Expect100ContinueServicePoint.Expect100Continuefalse正確處理期望失敗(417)並更改WCF客戶端應用程序中的Expect100Continue

try 
{ 
    //ServicePointManager.Expect100Continue = false; // If uncomment all work 
    var svc = new ServiceClient(); 
    svc.GetData(); // first error 
} 
catch (ProtocolException pex) 
{ 
    if (pex.Message.Contains("(417)")) 
    { 
     ServicePointManager.Expect100Continue = false; 
     var sp = ServicePointManager.FindServicePoint(new Uri(@"http://addr.to.service/service.svc")); 
     sp.Expect100Continue = false; 

     var svc = new ServiceClient(); 
     svc.GetData(); // second same error 
    } 
} 

但是,該服務的第二個呼叫也會失敗。但是,如果在任何連接之前將Expect100Continue設置爲false,則與該服務的通信將正常工作。

這樣正確處理Expect100Continue錯誤嗎?我需要應用程序自動適應而無需用戶操作。我忘了做什麼工作?

回答

1

ServicePointManager上的大多數設置都被視爲在應用程序生命週期中的該點之後創建的所有NEW ServicePoint上應用的默認值。在查看錯誤後更改設置的情況下,實際上並未更改現有ServicePoint實例上的任何內容,包括與WCF使用的連接關聯的實例。

在您的示例代碼中,您致電ServicePointManager.FindServicePoint嘗試查找正確的ServicePoint。但是,FindServicePoint有幾個重載,並且很容易錯誤地使用該API。例如,FindServicePoint會嘗試考慮http/https,您正在連接的主機,您的代理配置等等。如果您沒有向FindServicePoint提供正確的參數,那麼您可能會輕易地將錯誤的ServicePoint返回給您和您的設置將不會應用於您打算更改的ServicePoint

我建議您使用FindServicePoint超載,需要IWebProxy object以確保您獲得正確的ServicePoint。在大多數情況下,您應該能夠通過WebRequest.DefaultWebProxy作爲IWebProxy對象。

+0

我將'WebRequest.DefaultWebProxy'傳遞給'FindServicePoint'並且它可以工作。 –

0

從ServicePointManager.Expect100Continue的MSDN文檔,

更改此屬性的值不會影響現有的ServicePoint對象。只有在更改後創建的新ServicePoint對象受到影響。因此,更改現有WCF客戶端上的值將不起作用。您需要創建一個新的WCF客戶端,然後調用GetData()

相關問題