0

问题是在 AfterReceiveRequest 如何使用 OperationDescription 找出操作上设置的自定义属性?如果有办法,在服务契约接口或服务实现类中的操作声明上设置自定义属性更好吗?

为了进一步说明问题:

public interface IGetterSetterService
{
    [OperationContract, GetterRequest]
    Data[] GetData();
    [OperationContract, SetterRequest]
    bool SetData(string Data);
}

或者

[WebInvoke(Method = "*", ResponseFormat = WebMessageFormat.Json, UriTemplate = "xyz"]
[GetterRequest]
public Data[] GetData()
{
    return new Data[];
}
[WebInvoke(Method = "*", ResponseFormat = WebMessageformat.Json, UriTemplate = "xyz/{data}"]
[SetterRequest]
public bool SetData(string data)
{
    return true;
}

现在是 IDispatchMessageInspector:

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
    //Here how to find out the GetterRequest or SetterRequest custom attribute set on an
    //operation, may be using OperationDescription for the current context?
}
4

2 回答 2

1

我的完整解决方案看起来像这样,它没有任何问题: 1.首先获取此处
讨论的操作描述 2.然后找到在服务界面中的操作上设置的自定义属性:

private UserAction GetIntendedUserAction(OperationDescription opDesc)
{
    Type contractType = opDesc.DeclaringContract.ContractType;
    var attr = contractType.GetMethod(opDesc.Name).GeCustomAttributes(typeof(RequestedAction), false) as RequestedAction[];
    if (attr != null && attr.Length > 0)
    {
        return attr[0].ActionName;
    }
    else
    {
        return UserAction.Unknown;
    }
}
public enum UserAction
{
    Unknown = 0,
    View = 1,
    Control = 2,
    SysAdmin = 3,
}
[AttributeUsage(AttributeTargets.Method)]
public class RequestedAction : Attribute
{
    public UserAction ActionName { get; set; }
    public RequestedAction(UserAction action)
    {
        ActionName = action;
    }
}
于 2014-01-09T05:01:14.053 回答
0

我认为您可以使用以下代码:

public class operationdispatcher : IDispatchMessageInspector
{
    List<Type> MyAttrybutes = new List<Type>() { typeof(behaviorattribute) };

    public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        var serviceType = instanceContext.Host.Description.ServiceType;
        var operationName = OperationContext.Current.IncomingMessageHeaders.Action;
        var methodName = operationName.Substring(operationName.LastIndexOf("/") + 1);

        var method = serviceType.GetMethods().Where(m => m.Name == methodName && m.IsPublic).SingleOrDefault();
        var attributes = method.GetCustomAttributes(true).Where(a => MyAttrybutes.Contains(a.GetType()));

        foreach (var attribute in attributes)
        {
            // you might want to instantiate an attribute and do something
        }

        return null;
    }
}

注意:这里使用的是服务实现类,而不是接口。如果您使用 method.GetCustomAttributes(true) 那么您将获得指定方法的所有自定义属性(那些从接口继承的属性)。

于 2014-01-08T20:58:00.067 回答