所以,我试着写路由服务。这个想法是,每当有人调用路由服务时,WCF行为扩展都会随机选择端点。我使用了MSDN中稍微修改过的一个名为 DynamicReconfiguration 的示例来实现这一点。我的web.config的一部分看起来像这样
<behaviors>
<serviceBehaviors>
<behavior>
<behavior name="behaviorWithUpdate">
<updateBehavior />
</behavior>
</serviceBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="updateBehavior" type="RouterService.UpdateBehavior, RouterService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
<services>
并实施行为和行为延伸
public class UpdateBehavior : BehaviorExtensionElement, IServiceBehavior
{
void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
var rulesUpdateExtension = new RulesUpdateExtension();
serviceHostBase.Extensions.Add(rulesUpdateExtension);
}
void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
class RulesUpdateExtension : IExtension<ServiceHostBase>
{
ServiceHostBase _owner;
List<EndpointAddress> _endpoints = new List<EndpointAddress>
{
new EndpointAddress("http://localhost:19338/Service1.svc"),
new EndpointAddress("http://localhost:20464/Service2.svc")
};
void IExtension<ServiceHostBase>.Attach(ServiceHostBase owner)
{
this._owner = owner;
UpdateRules(DateTime.Now.Second % 2 == 0 ? _endpoints[0] : _endpoints[1]);
}
void IExtension<ServiceHostBase>.Detach(ServiceHostBase owner)
{
}
void UpdateRules(EndpointAddress endpoint)
{
var rc = new RoutingConfiguration();
var serviceEndpoint = new ServiceEndpoint(
ContractDescription.GetContract(typeof(IService1)),
new BasicHttpBinding(),
endpoint);
rc.FilterTable.Add(new MatchAllMessageFilter(), new List<ServiceEndpoint> { serviceEndpoint });
this._owner.Extensions.Find<RoutingExtension>().ApplyConfiguration(rc);
}
}
public override Type BehaviorType
{
get { return typeof(UpdateBehavior); }
}
protected override object CreateBehavior()
{
return new UpdateBehavior();
}
}
问题是 UpdateRules 方法的最后一行是抛出 NullReferenceException 。即使我在行为中附加它,它也找不到这个扩展名。在MSDN的示例中,路由服务托管在控制台应用程序中,这里我试图在IIS上托管它。我在这里遗漏了一些东西......
答案 0 :(得分:1)
在示例RoutingService项目中,routing.cs中的代码以编程方式将RoutingExtension注入RoutingService。这通常在配置文件中使用行为&gt; serviceBehaviors&gt; behavior&gt;路由元素来设置要使用的过滤器表。但是,由于WCF服务只能通过配置文件分配单个服务行为,因此示例RoutingService项目会在服务主机初始化中动态添加RoutingExtension。
要在IIS中执行相同的操作,您需要创建自定义服务主机工厂,以便在示例项目中执行routing.cs代码的相同功能。 Look at this MSDN article了解如何创建自定义主机。它还显示了如何使用IIS配置它。