2011-10-12 80 views
2

我有一個WCF服務契約實現,可以用作一個普通的dll或作爲一個Web服務。有沒有什麼方法可以從代碼中識別它是如何使用的。 更具體地說,我需要在這些情況下拋出不同的例外。如何識別代碼是否在web服務中運行?

謝謝

+0

需要一些更多的信息。您是否有示例代碼,如果這是一個封閉的源代碼組件,您是否有示例客戶端代碼? – MatthewMartin

+0

您可以使用OperationContext類來找出調用WCF服務的機器的IP地址,並查看它是否是您的Web服務器的地址? – GrandMasterFlush

+0

好吧,它很簡單。我有一個公共類Service:IService {},其中IService被定義爲ServiceContract。服務可以通過Web服務中的端點公開,也可以通過引用應用程序中的dll訪問。 – user991759

回答

0

很公平。在這種情況下,您可以檢查庫中的各種上下文。

WCF

bool isWcf = OperationContext.Current != null; 

網絡

bool isWeb = System.Web.HttpContext.Current != null; 
+0

這可能是答案,我會在試用後回來。 – user991759

1

我不確定自己的具體要求,但似乎平原DLL是一個標準的業務邏輯庫。根據我的經驗,我建議儘可能地將業務邏輯作爲實現不可知的方式(理所當然),因爲無論如何您都可能會以不同的方式處理異常。通過基於實現拋出不同的異常,您將把業務邏輯的責任與實現者的責任混合在一起。

我的建議是從業務邏輯庫中拋出一組常見的異常,並針對每個實現對它們進行不同的處理/處理。例如。一個控制檯應用程序可能會再次要求輸入,因爲WCF應用程序可能會拋出一個錯誤異常。

以下面的代碼爲例:

// Simple business logic that throws common exceptions 
namespace BusinessLogicLibrary 
{ 
    public class Math 
    { 
     public static int Divide(int dividend, int divisor) 
     { 
      if (divisor == 0) 
       throw new DivideByZeroException(); 

      return dividend/divisor; 
     } 
    } 
} 

// WCF calls to business logic and handles the exception differently 
namespace WcfProject 
{ 
    [ServiceContract] 
    public interface IService 
    { 
     [OperationContract] 
     int Divide(int dividend, int divisor); 
    } 

    public class Service : IService 
    { 
     public int Divide(int dividend, int divisor) 
     { 
      try 
      { 
       return BusinessLogicLibrary.Math.Divide(dividend, divisor); 
      } 
      catch (Exception ex) 
      { 
       throw new FaultException(
        new FaultReason(ex.Message), 
        new FaultCode("Division Error")); 
      } 
     } 
    } 
} 

// Console application calls library directly and handles the exception differently 
namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ShowDivide(); 
     } 

     static void ShowDivide() 
     { 
      try 
      { 
       Console.WriteLine("Enter the dividend: "); 
       int dividend = int.Parse(Console.ReadLine()); 

       Console.WriteLine("Enter the divisor: "); 
       int divisor = int.Parse(Console.ReadLine()); 

       int result = BusinessLogicLibrary.Math.Divide(dividend, divisor); 
       Console.WriteLine("Result: {0}", result); 
      } 
      catch (DivideByZeroException) 
      { 
       // error occurred but we can ask the user again 
       Console.WriteLine("Cannot divide by zero. Please retry."); 
       ShowDivide(); 
      } 
     } 
    } 
} 
+0

承載是的,這是一種常見的方法,但不幸的是在這種情況下不是一種選擇。 – user991759

相關問題