Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在WCF服务的IOperationBehavior属性中获取当前端点信息?_Wcf_Json_Extensibility_Endpoint_Json Rpc - Fatal编程技术网

如何在WCF服务的IOperationBehavior属性中获取当前端点信息?

如何在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

我有一个公开两个端点的服务,我只想对其中一个端点应用消息格式

为此,我希望捕获端点名称,以便仅将MessageFormatter应用于此特定端点

这是“我的操作行为”属性的代码:

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;
        }
    }