如何识别代码是否在Web服务中运行?

时间:2011-10-12 15:43:38

标签: .net dll service web

我有一个WCF服务合同实现,可以用作普通dll或Web服务。有没有办法确定(从其代码中)如何使用它。 更具体地说,我需要在这些情况下抛出不同的例外。

谢谢

2 个答案:

答案 0 :(得分:1)

我不确定您的具体要求,但似乎 plain 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();
            }
        }
    }
}

答案 1 :(得分:0)

足够公平。在这种情况下,您可以检查库中的各种上下文。

WCF

bool isWcf = OperationContext.Current != null;

网络

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