如何在WCF服务的IOperationBehavior属性中获取当前端点信息?
我有一个公开两个端点的服务,我只想对其中一个端点应用消息格式 为此,我希望捕获端点名称,以便仅将MessageFormatter应用于此特定端点 这是“我的操作行为”属性的代码:如何在WCF服务的IOperationBehavior属性中获取当前端点信息?,wcf,json,extensibility,endpoint,json-rpc,Wcf,Json,Extensibility,Endpoint,Json Rpc,我有一个公开两个端点的服务,我只想对其中一个端点应用消息格式 为此,我希望捕获端点名称,以便仅将MessageFormatter应用于此特定端点 这是“我的操作行为”属性的代码: public class JsonRpcMessageValidation : Attribute, IOperationBehavior { #region Properties public Type serializeType { get; set; } public Type des
public class JsonRpcMessageValidation : Attribute, IOperationBehavior
{
#region Properties
public Type serializeType { get; set; }
public Type deserializeType { get; set; }
#endregion
#region Constructors
/// <summary>
///
/// </summary>
/// <param name="serializeType">Serialize Type</param>
/// <param name="deserializeType">Deserialize Type</param>
public JsonRpcMessageValidation(Type serializeType, Type deserializeType)
{
this.serializeType = serializeType;
this.deserializeType = deserializeType;
}
#endregion
#region Methods
public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.ClientOperation clientOperation)
{
}
public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
{
JsonRpcRequestMessageInspector jrrmInspector = new JsonRpcRequestMessageInspector();
dispatchOperation.ParameterInspectors.Add(jrrmInspector);
JsonRpcMessageFormatter jrmFormatter = new JsonRpcMessageFormatter(serializeType, deserializeType);
dispatchOperation.Formatter = jrmFormatter;
}
public void Validate(OperationDescription operationDescription)
{
}
#endregion
}
公共类JsonRpcMessageValidation:属性,IOperationBehavior
{
#区域属性
公共类型序列化类型{get;set;}
公共类型反序列化类型{get;set;}
#端区
#区域构造函数
///
///
///
///序列化类型
///反序列化类型
公共JsonRpcMessageValidation(类型serializeType,类型deserializeType)
{
this.serializeType=serializeType;
this.deserializeType=deserializeType;
}
#端区
#区域方法
public void AddBindingParameters(OperationDescription OperationDescription,System.ServiceModel.Channel.BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(操作说明操作说明,System.ServiceModel.Dispatcher.ClientOperation ClientOperation)
{
}
公共无效ApplyDispatchBehavior(操作说明操作说明,System.ServiceModel.Dispatcher.DispatchOperation DispatchOperation)
{
JsonRpcRequestMessageInspector JRRInspector=新的JsonRpcRequestMessageInspector();
dispatchOperation.ParameterInspectors.Add(JRRInspector);
JsonRpcMessageFormatter jrmFormatter=新的JsonRpcMessageFormatter(serializeType,deserializeType);
dispatchOperation.Formatter=jrmFormatter;
}
公共无效验证(OperationDescription OperationDescription)
{
}
#端区
}
我用这个属性装饰接口中的方法,我需要类型信息,以便对传入和传出消息执行序列化和反序列化
有人知道如何在代码的这一点上获取当前端点信息吗
谢谢我认为更适合使用IEndpointBehavior实现,在需要自定义MessageFormatter的适当端点上使用
--larsw实际上我需要使用IOperationBehavior,因为我使用属性来修饰方法,每个方法都有不同的请求和响应类型,我使用它们对传入和传出消息执行序列化和反序列化,否则是的,它将适合使用IEndpointBehavior
Thx我能够解决这个问题: 我只是使用以下方法从dispatchOperation检索端点:
private static string GetCurrentEndpointName(System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
{
string endpoint = String.Empty;
if (dispatchOperation.Parent.EndpointDispatcher.EndpointAddress.Uri.Segments.Count() > 0)
{
endpoint = dispatchOperation.Parent.EndpointDispatcher.EndpointAddress.Uri.Segments[dispatchOperation.Parent.EndpointDispatcher.EndpointAddress.Uri.Segments.Count() - 1];
}
return endpoint;
}
现在,它将消息格式化程序专门应用于ApplyDispatchBehavior方法中的端点“json”:
public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
{
JsonRpcRequestMessageInspector jrrmInspector = new JsonRpcRequestMessageInspector();
dispatchOperation.ParameterInspectors.Add(jrrmInspector);
var endpoint = GetCurrentEndpointName(dispatchOperation);
//it only applies the Message Formatter to the 'json' endpoint
if (endpoint == "json")
{
JsonRpcMessageFormatter jrmFormatter = new JsonRpcMessageFormatter(serializeType, deserializeType);
dispatchOperation.Formatter = jrmFormatter;
}
}