是的,可以爲託管在IIS中的服務添加行爲。行爲不關心服務的託管環境。 Carlos Figueira的博客提供了可應用於服務,終端,合同和運營的所有類型行爲的示例。我試着爲我服務的樣例代碼託管在IIS(在web.config文件中定義端點) - 配置文件在這裏需要補充的行爲ExtensionElement
public class MyEndpointBehavior : BehaviorExtensionElement, IEndpointBehavior
{
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
Console.WriteLine("applying dispatch behavior");
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new MyInspector());
endpointDispatcher.DispatchRuntime.OperationSelector = new MyOperationSelector();
}
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
public override Type BehaviorType
{
get { return this.GetType(); }
}
protected override object CreateBehavior()
{
return new MyEndpointBehavior();
}
}
public class MyOperationSelector : IDispatchOperationSelector
{
public string SelectOperation(ref Message message)
{
Console.WriteLine("good luck");
string action = message.Headers.Action;
return action.Substring(action.LastIndexOf('/') + 1);
}
}
public class MyInspector : IDispatchMessageInspector
{
public object AfterReceiveRequest(ref Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
return (Message) request;
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
}
}
}
與行爲
配置文件添加爲擴展元素 -
<system.serviceModel>
<services>
<service name="RouteToServiceA.Service1">
<endpoint address="Service1" binding="basicHttpBinding" contract="RouteToServiceA.IService1" behaviorConfiguration="testEndPoint" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true" />
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="testEndPoint">
<testBehavior />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="testBehavior" type="RouteToServiceA.MyEndpointBehavior, RouteToServiceA" />
</behaviorExtensions>
</extensions>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
看看Carlos Figueira的博客 - 他有一個關於WCF可擴展性的系列代碼示例 - [WCF Extensibility](http://blogs.msdn.com/b/carlosfigueira/存檔/ 2011/03/14/wcf-extensibility.aspx) – Tim
我正在看博客,作爲WCF的新手,我只想看看我是否採取正確的路徑:) –