Как получить информацию о текущей конечной точке в атрибуте IOperationBehavior в службе WCF? - PullRequest
0 голосов
/ 19 апреля 2011

У меня есть служба, предоставляющая 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
}

Я украшаю метод в интерфейсе этими атрибутами, и мне нужна информация о типе для выполнения сериализации и десериализации входящих и исходящих сообщений.

Кто-нибудь знает, как получить информацию о текущей конечной точке в этой точке кода?

Спасибо

Ответы [ 3 ]

1 голос
/ 11 мая 2011

Я смог обойти это:

Я просто использовал метод ниже, чтобы извлечь конечную точку из 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;
    }

И теперь он применяет форматеры сообщений ИСКЛЮЧИТЕЛЬНО кконечная точка "json" в методе ApplyDispatchBehavior:

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;
        }
    }
0 голосов
/ 20 апреля 2011

На самом деле мне нужно использовать IOperationBehavior, потому что я использую атрибут для украшения методов, и у каждого метода есть разные типы запросов и ответов, которые я использую для выполнения сериализации и десериализации входящих и исходящих сообщений, в противном случае да, это было бы целесообразно использоватьIEndpointBehavior.

Thx

0 голосов
/ 20 апреля 2011

Я думаю, что было бы более целесообразно использовать реализацию IEndpointBehavior, которую вы используете в соответствующей конечной точке, где вам нужен пользовательский MessageFormatter.

- larsw

...