C# 如何在方法调用时指定属性
我有一个行动方法。 它有2个属性C# 如何在方法调用时指定属性,c#,asp.net,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,我有一个行动方法。 它有2个属性 [Authorization] [OutputCache] ActionResult LoadImage() 我从两个方法调用LoadImage操作 说1:索引2:创建 当我从索引调用LoadImage操作时,我希望执行LoadImage的两个属性。 当我从Create调用LoadImage操作时,我只希望执行授权属性。 我不想使用VaryByParam。正如Peter Duniho所指出的,在这种情况下,您应该有两个操作方法,每个操作方法应用不同的属性(如适
[Authorization]
[OutputCache]
ActionResult LoadImage()
我从两个方法调用LoadImage操作
说1:索引2:创建
当我从索引调用LoadImage操作时,我希望执行LoadImage的两个属性。
当我从Create调用LoadImage操作时,我只希望执行授权属性。
我不想使用VaryByParam。正如Peter Duniho所指出的,在这种情况下,您应该有两个操作方法,每个操作方法应用不同的属性(如适用) 就冗余而言,您可以在私有方法中使用公共逻辑。可以从公共操作方法调用此私有方法 我并不是在这里为你的问题提供一个直接的解决方案,但是我认为澄清一下这一点很重要,有时你必须做出选择一个原则而不是另一个原则的决定。在这种情况下,我认为Vs
这里的建议是保持简单,有两种方法。无论如何,它不会直接违反DRY。正如Peter Duniho所指出的,在这种情况下,您应该对每个操作方法应用两个具有不同属性的操作方法 就冗余而言,您可以在私有方法中使用公共逻辑。可以从公共操作方法调用此私有方法 我并不是在这里为你的问题提供一个直接的解决方案,但是我认为澄清一下这一点很重要,有时你必须做出选择一个原则而不是另一个原则的决定。在这种情况下,我认为Vs
这里的建议是保持简单,有两种方法。无论如何,它不会直接违反DRY。正如Peter Duniho所指出的,在这种情况下,您应该对每个操作方法应用两个具有不同属性的操作方法 就冗余而言,您可以在私有方法中使用公共逻辑。可以从公共操作方法调用此私有方法 我并不是在这里为你的问题提供一个直接的解决方案,但是我认为澄清一下这一点很重要,有时你必须做出选择一个原则而不是另一个原则的决定。在这种情况下,我认为Vs
这里的建议是保持简单,有两种方法。无论如何,它不会直接违反DRY。正如Peter Duniho所指出的,在这种情况下,您应该对每个操作方法应用两个具有不同属性的操作方法 就冗余而言,您可以在私有方法中使用公共逻辑。可以从公共操作方法调用此私有方法 我并不是在这里为你的问题提供一个直接的解决方案,但是我认为澄清一下这一点很重要,有时你必须做出选择一个原则而不是另一个原则的决定。在这种情况下,我认为Vs
这里的建议是保持简单,有两种方法。无论如何,它不会直接违反DRY。请查看我先前的回答,看看这是否满足您的要求。如果你真的要达到你在问题中所说的,下面是如何 定义自定义授权属性。检查Request.Params中的值,以决定是否应用属性或跳过授权,类似于通过
AllowAnonymous
属性实现的授权
示例代码(需要根据需要进行一些更改):
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,Inherited=true,AllowMultiple=false)]
公共密封类ProspectProfileAuthorizationAttribute:AuthorizationAttribute
{
///
///基于请求是否包含有效数据的特殊授权检查。
///
///
授权时的公共覆盖无效(AuthorizationContext filterContext)
{
ArgumentNotNull(filterContext,“filterContext”);
ArgumentNotNull(filterContext.Controller,“filterContext.Controller”);
bool skipAuthorization=filterContext.ActionDescriptor.IsDefined(
typeof(CustomAllowAnonymous),inherit:true)
||filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
typeof(CustomAllowAnonymous),inherit:true);
如果(授权)
{
返回;
}
var request=filterContext.RequestContext.HttpContext.request;
NameValueCollection参数Collection=ReadQueryStringData(filterContext,请求);
if(参数collection.Count<3)
{
抛出新的InvalidOperationException(“参数数无效的请求”);
}
//检查1:请求是否经过身份验证,即来自浏览器的请求是否由登录用户验证
//无需进一步检查。
如果(请求已验证)
{
返回;
}
//检查2:请求来自外部源,是否有效,即是否包含
//有效的下载代码。
if(string.IsNullOrEmpty(下载代码))
{
抛出新的InvalidOperationException(常量。下载代码无效);
}
如果(!userType.Equals(Constants.SystemIntegrationUserName))
{
var exportReportService=DependencyResolver.Current.GetService();
if(exportReportService!=null)
{
如果(!exportReportService.VerifyDownloadCode(下载代码))
{
//无效的合作伙伴密钥
抛出新的InvalidOperationException(常量。下载代码无效);
}
}
}
}
私有静态NameValueCollection ReadQueryStringData(AuthorizationContext filterContext,HttpRequestBase请求)
{
//从请求中获取查询字符串参数
//原创的
//var encryptedData=request.Params[“data”];
//将替换应用于带+symb的空格
var encryptedData=request.Params[“data”]。替换(“,“+”);
var decryptedData=EncryptionHelper.DecryptString(加密
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public sealed class ProspectProfileAuthorizationAttribute : AuthorizeAttribute
{
/// <summary>
/// Special authorization check based on whether request contain valid data or not.
/// </summary>
/// <param name="filterContext"></param>
public override void OnAuthorization(AuthorizationContext filterContext)
{
Guard.ArgumentNotNull(filterContext, "filterContext");
Guard.ArgumentNotNull(filterContext.Controller, "filterContext.Controller");
bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(
typeof(CustomAllowAnonymous), inherit: true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
typeof(CustomAllowAnonymous), inherit: true);
if (skipAuthorization)
{
return;
}
var request = filterContext.RequestContext.HttpContext.Request;
NameValueCollection parameterCollection = ReadQueryStringData(filterContext, request);
if (parameterCollection.Count < 3)
{
throw new InvalidOperationException("Request with invalid number of parameter");
}
// Check 1: Is request authenticated i.e. coming from browser by a logged in user
// No further check required.
if (request.IsAuthenticated)
{
return;
}
// Check 2: Request is coming from an external source, is it valid i.e. does it contains
// valid download code.
if (string.IsNullOrEmpty(downloadCode))
{
throw new InvalidOperationException(Constants.Invalid_Download_Code);
}
if (!userType.Equals(Constants.SystemIntegrationUserName))
{
var exportReportService = DependencyResolver.Current.GetService<IExportReportService>();
if (exportReportService != null)
{
if (!exportReportService.VerifyDownloadCode(downloadCode))
{
// Invalid partner key
throw new InvalidOperationException(Constants.Invalid_Download_Code);
}
}
}
}
private static NameValueCollection ReadQueryStringData(AuthorizationContext filterContext, HttpRequestBase request)
{
// Obtain query string parameter from request
//original
//var encryptedData = request.Params["data"];
// Applying the replace for space with + symb
var encryptedData = request.Params["data"].Replace(" ","+");
var decryptedData = EncryptionHelper.DecryptString(encryptedData);
// Validate the parameter
var dict = HttpUtility.ParseQueryString(decryptedData);
return dict;
}
}