2010-07-12 82 views

回答

1

這樣如何:創建一個自定義的ServiceBehavior來攔截我的傳入請求到服務。然後,讓自定義行爲檢查我的配置文件中的用戶定義標誌,例如<add key="IsMyServiceUp" value="true" />,並且如果該值返回爲false,那麼用我友好的消息和HTTP代碼503 - Service Unavailable引發ServiceException。

這聽起來合理嗎?然後,我所要做的就是更改我的配置文件中的標誌,以指定服務啓動或停止的位置。

+1

是的,類似的東西會起作用。但是,我會拋出一個可互操作的'FaultException ' - 您的服務的使用者可能不會使用.NET,因此無法真正處理'ServiceException' – 2010-07-12 16:42:09

+1

是的,謝謝你的提問。實際上,我有一個.NET REST-ful服務門面,它使用引發ServiceException的SOAP服務。 REST-ful服務外觀層反過來將捕獲ServiceException,解開我需要的有用信息,並且拋出一個新的WebFaultException,它繼承自FaultException 。希望這可以解決上面提到的針對非.NET REST服務使用者的互操作性問題。 – Shafique 2010-07-12 16:46:59

2

你將不得不有第二個服務,提供相同的接口,相同的方法等,都將返回友好的消息,而不是一個真實的結果。

當這些服務方法不只是返回一個字符串而是一個複雜的數據對象時,這可能會有點棘手 - 你把那個「友好」的消息放在哪裏?

在現實中,我認爲這不可能真的做到 - 因爲你的服務通常不被實際人員「看到」,所以你不能只放一個app_offline.htm文件或類似的東西。

儘量減少停機時間,例如,在新端口上設置新版本的服務並在那裏進行測試,直到您有足夠的信心進行切換。

使用WCF,它主要是更新/複製適當的配置周圍的練習,所以你的服務應該永遠不會在任何延長的時間段內無法使用(希望!)。

如果你真的必須,你可以做什麼,只是有可更換的服務,將總是拋出一個FaultContract<ServiceDownForMaintenance> - 但隨後調用服務的客戶必須瞭解這一點,他們將不得不處理這個並提出錯誤或信息消息。您的服務不能真正提供...

+0

你編輯你的答案添加錯誤合同,所以我刪除我的,但我想添加一個評論:雖然我同意有一個公共服務去「維護」是不應該的東西完成後,可能有這樣做的正當理由;例如,銀行經常長時間下調「交易後」等等。 – Randolpho 2010-07-12 16:34:48

+0

@Shafique:一般而言,您應該避免讓您的服務提供「友善的服務已關閉」信息,*除非*您處於這種情況。如果您在這種情況下*,請確保服務可以停止的事實是合同的一部分,您的服務的消費者*知道*並且可以處理它! – Randolpho 2010-07-12 16:35:26

+0

爲了公平起見,我僅以「維修保養」爲例。出於商業原因,我們需要將我們的服務脫機,並提供一個友好的信息,表明該服務已關閉,但不一定用於維護。感謝您的輸入! – Shafique 2010-07-12 16:39:28

0

好吧,所以我創建了一個實現IOperationBehavior的新自定義行爲。在驗證方法,我有

public void Validate(OperationDescription operationDescription) 
    { 
     bool isServiceUp = Boolean.Parse(ConfigurationManager.AppSettings["IsOrderServiceUp"].ToString()); 
     if (!isServiceUp) 
     { 
      throw new ServiceException(ServiceErrorCode.Generic_Server_Exception, 
      ServiceErrors.Generic_Server_Exception, 
      SoapFaultCode.Server); 
     } 
    } 

其他實施方式ApplyClientBehaviorApplyDispatchBehaviorAddBindingParameters都是空的。

我已經裝飾了我的服務操作之一[ServiceStatusValidation],這是我的自定義行爲的類名稱。

當我啓動服務並導航到這個裝飾的操作時,我沒有得到我拋出的異常。 SOAP UI在響應窗格中沒有顯示任何內容,我的消費REST外觀給出了一個通用的400錯誤。異常消息是'服務器沒有提供有意義的回覆;這可能是由於合同不匹配,過早的會話關閉或內部服務器錯誤造成的。「

任何想法?我應該用其他方法之一來實現這個邏輯,而我沒有實現這個方法,而不是Validate方法?

相關問題