Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.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
C# 如何在方法调用时指定属性_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 3_Asp.net Mvc 4 - Fatal编程技术网

C# 如何在方法调用时指定属性

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所指出的,在这种情况下,您应该有两个操作方法,每个操作方法应用不同的属性(如适

我有一个行动方法。 它有2个属性

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

   }
}