0

我有一个公开 2 个端点的服务,我想仅将消息格式应用于其中一个端点。

为此,我希望捕获端点名称,以便仅将 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
}

我用这个属性装饰了接口中的方法,我需要类型信息以便对传入和传出的消息执行序列化和反序列化。

有谁知道如何在代码中获取当前端点信息?

谢谢

4

3 回答 3

1

我能够解决这个问题:

我只是使用下面的方法从 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;
        }
    }
于 2011-05-11T10:57:07.833 回答
0

我认为使用 IEndpointBehavior 实现会更合适,您可以在需要自定义 MessageFormatter 的适当端点上使用它。

--larsw

于 2011-04-19T20:45:20.593 回答
0

实际上我需要使用 IOperationBehavior,因为我使用属性来装饰方法,并且每个方法都有不同的请求和响应类型,用于对传入和传出的消息执行序列化和反序列化,否则是的,它适合使用 IEndpointBehavior。

谢谢

于 2011-04-19T22:53:15.260 回答