Как определить, выполняется ли код внутри веб-службы? - PullRequest
2 голосов
/ 12 октября 2011

У меня есть реализация контракта службы WCF, которую можно использовать как простой dll или как веб-сервис. Есть ли способ определить (из своего кода), как он используется. В частности, в этих случаях мне нужно выдавать разные исключения.

Спасибо

Ответы [ 2 ]

1 голос
/ 13 октября 2011

Я не уверен в ваших конкретных требованиях, но кажется, что 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();
            }
        }
    }
}
0 голосов
/ 13 октября 2011

Достаточно справедливо.В этом случае вы можете проверить различные контексты в библиотеке.

WCF

bool isWcf = OperationContext.Current != null;

Web

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