Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何识别代码是否在Web服务中运行?_.net_Dll_Service_Web - Fatal编程技术网

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

.net 如何识别代码是否在Web服务中运行?,.net,dll,service,web,.net,Dll,Service,Web,我有一个WCF服务契约实现,它既可以用作普通dll,也可以用作web服务。有没有办法(从代码中)确定它是如何使用的。 更具体地说,我需要在这些情况下抛出不同的异常 谢谢你我不确定你的具体要求,但普通dll似乎是一个标准的业务逻辑库。根据我的经验,我建议尽可能让业务逻辑与实现无关(当然是合理的),因为您可能会以不同的方式处理异常。通过基于实现抛出不同的异常,您将混合业务逻辑和实现者的职责 我的建议是从业务逻辑库中抛出一组常见的异常,并对每个实现进行不同的捕获/处理。例如,控制台应用程序可能只是再次

我有一个WCF服务契约实现,它既可以用作普通dll,也可以用作web服务。有没有办法(从代码中)确定它是如何使用的。 更具体地说,我需要在这些情况下抛出不同的异常


谢谢你

我不确定你的具体要求,但普通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();
            }
        }
    }
}

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

周转基金


我需要更多的信息。您是否有示例代码,如果这是一个封闭源代码组件,您是否有示例客户端代码?您是否可以使用OperationContext类查找调用WCF服务的计算机的IP地址,并查看它是否是web服务器的地址?很简单。我有一个公共类服务:IService{},其中IService被定义为ServiceContract。服务可以通过Web服务中的端点公开,也可以仅通过引用应用程序中的dll来访问。dll本身是否也包含WCF宿主代码,或者在作为Web服务公开的情况下,dll是否仅由WCF主机加载?在这种情况下,什么是主机(IIS…)?是的,这是一种常见的方法,但不幸的是,在当前的情况下,这不是一个选项。这可能是答案,我将在尝试后返回。
bool isWcf = OperationContext.Current != null;
bool isWeb = System.Web.HttpContext.Current != null;