我希望能够通过在service.svc文件中放置一个参数,将特定于应用程序的配置信息传递给我的WCF。
我有一个标准的错误记录Web服务,我从不同的应用程序调用。我希望能够使用不同的名称调用该服务,并让服务知道如何调用它并写入不同的文件。例如,应用程序将调用Warning.svc,Serious.svc或Critical.svc,并根据所调用的内容将消息写入相应的文件。
所以我的想法是在.svc文件中放一个参数告诉WCF如何调用它。如果不是这样,有没有办法从我的代码中获取svc文件的名称?
我知道每次调用我可以使用不同的方法,但是当我想添加其他类型时,需要修改WCF。虽然我可以添加另一个.svc,但无需修改任何代码即可添加功能。
答案 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,则写入默认值。这是通常在常见的日志包中完成的。