我正在编写一个需要托管多个 WCF 服务的应用程序。WCF 的优势之一是能够通过在 app.config 文件中指定设置来配置服务而无需重新编译。
自托管时,似乎没有一种开箱即用的方式来自动托管 app.config 文件中的服务。我发现这个问题提到了一个可能的解决方案,即在运行时动态枚举 app.config 中列出的服务,并为每个服务创建一个 ServiceHost。
但是,我的服务、合同和托管应用程序都在不同的程序集中。这会导致Type.GetType(string name)
无法找到我的服务类型(返回null
),因为它是在不同的程序集中定义的。
如何可靠地动态托管 app.config 文件中列出的所有服务(即,new ServiceHost(typeof(MyService))
在我的自托管应用程序中不进行硬编码?
注意:我的 app.config 是使用 Visual Studio 2010 中的“WCF 配置编辑器”生成的。
另请注意:我的主要目标是让 app.config 文件驱动它,这样就有了单点配置。我不想在单独的位置配置它。
编辑:我能够读取 app.config 文件(请参见此处),但需要能够解析不同程序集中的类型。
编辑:下面的答案之一提示我尝试在 app.config 中指定 AssemblyQualifiedName 而不仅仅是基本类型名称。这能够解决Type.GetType()
问题,但是现在无论我如何获得类型都ServiceHost.Open()
失败了:InvalidOperationException
// Fails
string typeName = typeof(MyService).AssemblyQualifiedName;
Type myType = Type.GetType(typeName);
ServiceHost host = new ServiceHost(myType);
host.Open(); // throws InvalidOperationException
// Also fails
Type myType2 = typeof(MyService);
ServiceHost host2 = new ServiceHost(myType2);
host2.Open(); // throws InvalidOperationException
异常详情:
Service 'SO.Example.MyService' has zero application (non-infrastructure) endpoints. This might be because no configuration file was found for your application, or because no service element matching the service name could be found in the configuration file, or because no endpoints were defined in the service element.
我猜 WCF 在内部解析 app.config 文件时会尝试匹配服务名称的文字字符串。
编辑/回答:我最终做的基本上就是下面答案中的内容。而不是使用Type.GetType()
我知道我所有的服务都在同一个程序集中,所以我切换到:
// Get a reference to the assembly which contain all of the service implementations.
Assembly implementationAssembly = Assembly.GetAssembly(typeof(MyService));
...
// When loading the type for the service, load it from the implementing assembly.
Type implementation = implementationAssembly.GetType(serviceElement.Name);