99 lines
3.7 KiB
C#
99 lines
3.7 KiB
C#
|
//------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//------------------------------------------------------------
|
||
|
namespace System.ServiceModel.Dispatcher
|
||
|
{
|
||
|
using System.ServiceModel.Channels;
|
||
|
using System.ServiceModel;
|
||
|
using System.ServiceModel.Description;
|
||
|
using System.Collections.ObjectModel;
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
[ObsoleteAttribute ("PeerChannel feature is obsolete and will be removed in the future.", false)]
|
||
|
class PeerValidationBehavior : IEndpointBehavior, IServiceBehavior
|
||
|
{
|
||
|
public static PeerValidationBehavior Instance
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (instance == null)
|
||
|
instance = new PeerValidationBehavior();
|
||
|
return instance;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static PeerValidationBehavior instance;
|
||
|
|
||
|
PeerValidationBehavior() { }
|
||
|
|
||
|
static bool IsRequestReplyContract(ContractDescription contract)
|
||
|
{
|
||
|
bool requestReply = false;
|
||
|
|
||
|
foreach (OperationDescription operation in contract.Operations)
|
||
|
{
|
||
|
if (operation.Messages.Count > 1) // Request-reply
|
||
|
{
|
||
|
requestReply = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return requestReply;
|
||
|
}
|
||
|
|
||
|
void IEndpointBehavior.Validate(ServiceEndpoint serviceEndpoint)
|
||
|
{
|
||
|
if (serviceEndpoint == null)
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("serviceEndpoint");
|
||
|
|
||
|
ContractDescription contract = serviceEndpoint.Contract;
|
||
|
Binding binding = serviceEndpoint.Binding;
|
||
|
ValidateHelper(contract, binding);
|
||
|
}
|
||
|
|
||
|
void IEndpointBehavior.AddBindingParameters(ServiceEndpoint serviceEndpoint, BindingParameterCollection bindingParameters)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint serviceEndpoint, EndpointDispatcher endpointDispatcher)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime behavior)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void IServiceBehavior.AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void IServiceBehavior.Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
|
||
|
{
|
||
|
if (description == null)
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("description");
|
||
|
|
||
|
for (int i = 0; i < description.Endpoints.Count; i++)
|
||
|
{
|
||
|
ServiceEndpoint endpoint = description.Endpoints[i];
|
||
|
ValidateHelper(endpoint.Contract, endpoint.Binding);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// SM doesn't support request-reply message pattern over multi-point channels correctly, so, disabling
|
||
|
// request-reply for NetPeerTcpBinding. (Advanced users may find a way to implement request-reply over
|
||
|
// a CustomBinding that includes PeerTransportBE.)
|
||
|
void ValidateHelper(ContractDescription contract, Binding binding)
|
||
|
{
|
||
|
if (binding is NetPeerTcpBinding && IsRequestReplyContract(contract))
|
||
|
{
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(
|
||
|
SR.GetString(SR.BindingDoesnTSupportRequestReplyButContract1, binding.Name)));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|