将参数添加到WCF .svc文件

时间:2011-03-15 02:52:42

标签: c# wcf visual-studio-2010

我希望能够通过在service.svc文件中放置一个参数,将特定于应用程序的配置信息传递给我的WCF。

我有一个标准的错误记录Web服务,我从不同的应用程序调用。我希望能够使用不同的名称调用该服务,并让服务知道如何调用它并写入不同的文件。例如,应用程序将调用Warning.svc,Serious.svc或Critical.svc,并根据所调用的内容将消息写入相应的文件。

所以我的想法是在.svc文件中放一个参数告诉WCF如何调用它。如果不是这样,有没有办法从我的代码中获取svc文件的名称?

我知道每次调用我可以使用不同的方法,但是当我想添加其他类型时,需要修改WCF。虽然我可以添加另一个.svc,但无需修改任何代码即可添加功能。

2 个答案:

答案 0 :(得分:3)

您可以在svc文件<%@ ServiceHost %>标记中指定自定义ServiceHostFactory,然后根据需要使用service属性。此值将传递给您的SHFactory,您可以在其中解析它并使用它初始化ServiceHost。

这是一个仅镜像默认WCF行为的示例:

Service1.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="WcfService2.Service1" Factory="WcfService2.CustomServiceHostFactory" CodeBehind="Service1.svc.cs" %>

CustomServiceHostFactory.cs:

namespace WcfService2
{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Activation;

    public class CustomServiceHostFactory : ServiceHostFactoryBase
    {
        public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
        {
            var host = new ServiceHost(Type.GetType(constructorString), baseAddresses);
            host.AddDefaultEndpoints();
            return host;
        }
    }
}

答案 1 :(得分:1)

我认为你不能在.svc文件中这样做。

但是,这似乎是一种非常复杂的方式来实现您想要做的事情,而且根本不是典型的Web服务风格。对于基本相同的Web服务,您不应该有太多的端点,只有很小的差异。这将是未来维持的噩梦。

为什么你不能修改你的方法来接受另一个参数,这是一个字符串或枚举或任何指示你想要登录哪个文件的参数?如果传递null,则写入默认值。这是通常在常见的日志包中完成的。