1

我需要在我的 .NET MVC 网站上进行调度功能,我遇到了 Quartz.net 库,它可以完全满足我的需要。

问题是我在主机(GoDaddy)上运行我的网站,当我添加Quartz.net 2.0.1到我的项目时,我遇到了"that assembly does not allow partially trusted callers"异常。经过一番研究,我发现很多人都有同样的问题,有些人通过从 Quartz.net 中删除 Common.Logging 库解决了这个问题。

我遵循了一些建议并删除了对 Common.Logging 的所有引用,但我仍然遇到问题。看起来这还不够,现在我遇到了Inheritance security rules violated while overriding member异常,更多细节:

Inheritance security rules violated while overriding member: 
Quartz.Util.DirtyFlagMap`2<TKey,TValue>.GetObjectData
(System.Runtime.Serialization.SerializationInfo, 
System.Runtime.Serialization.StreamingContext)'.
Security accessibility of the overriding method must match the 
security accessibility of the method being overriden.

看起来我真的需要在 Quartz.net 中改变一些东西才能让它工作。

有没有人以中等信任度运行 Quartz.net?如果是这样,需要做什么?可能有人可以提出一些替代方案吗?

4

2 回答 2

4

Steinar 的回答让我朝着正确的方向前进。在此处分享使 QuartZNet 在中等信任托管环境中工作的步骤。

QuartzNet 最初遇到了中等信任的权限问题,我们需要执行以下操作来解决问题

(1) 从 github 下载 QuartzNet 代码 ( 2.1.0.400 ) 并在对 AssemblyInfo.cs 进行以下更改后构建它

更换

#if !NET_40  
   [assembly: System.Security.AllowPartiallyTrustedCallers]  
#endif  

[assembly: AllowPartiallyTrustedCallers]  
#if NET_40  
   [assembly: SecurityRules(SecurityRuleSet.Level1)]  
#endif

(2) 下载 C5 代码 (v 2.1) 并使用

[assembly: AllowPartiallyTrustedCallersAttribute()

确保 C5 在与 Qartznet 相同的 .NET 版本中编译。

(3) 在 TGH 中的 web.config 中添加了 quartz 部分,该部分的 requirepermission 设置为 false。通用日志记录部分也将 requirepermission 设置为 false,还将其配置为使用 Common.Logging.Simple.NoOpLoggerFactoryAdapter。

<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
   <sectionGroup name="common">
     <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" requirePermission="false" />
   </sectionGroup>
   <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
 </configSections>
 <common>
    <logging>
      <factoryAdapter type="Common.Logging.Simple.NoOpLoggerFactoryAdapter, Common.Logging">
           <arg key="showLogName" value="true" />
           <arg key="showDataTime" value="true" />
           <arg key="level" value="OFF" />
           <arg key="dateTimeFormat" value="HH:mm:ss:fff" />
      </factoryAdapter>
    </logging>
  </common>
  <quartz>
      <add key="quartz.scheduler.instanceName" value="QuartzScheduler" />
      <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"  />
      <add key="quartz.threadPool.threadCount" value="10" />
      <add key="quartz.threadPool.threadPriority" value="2" />
      <add key="quartz.jobStore.misfireThreshold" value="60000" />
      <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />
  </quartz>

(4) 使用以namecollection为参数的构造函数初始化调度器,namecollection是从web.config中提取的quartz部分。

在 global.asax

QuartzScheduler.Start();

班上

public class QuartzScheduler
{
   public static void Start()
    {
       ISchedulerFactory schedulerFactory = new StdSchedulerFactory((NameValueCollection)ConfigurationManager.GetSection("quartz"));

       IScheduler scheduler = schedulerFactory.GetScheduler();
       scheduler.Start();

       IJobDetail inviteRequestProcessor = new JobDetailImpl("ProcessInviteRequest", null, typeof(InviteRequestJob));
       IDailyTimeIntervalTrigger trigger = new DailyTimeIntervalTriggerImpl("Invite Request Trigger", Quartz.TimeOfDay.HourMinuteAndSecondOfDay(0, 0, 0), Quartz.TimeOfDay.HourMinuteAndSecondOfDay(23, 23, 59), Quartz.IntervalUnit.Second, 1);
       scheduler.ScheduleJob(inviteRequestProcessor, trigger);
     }
  }

  public class InviteRequestJob : IJob
  {
     public void Execute(IJobExecutionContext context)
     {
        RequestInvite.ProcessInviteRequests();
     }
  }
于 2012-12-22T09:37:59.397 回答
1

我建议自己构建 Common.Logging 而不是从项目中删除它。您可以从http://netcommon.sourceforge.net/downloads.html获得最新的源代码。

我猜第二个问题与 C5.dll 也不被信任有关。我也会自己建造。来源可以在这里找到:http ://www.itu.dk/research/c5/ 。

尽管除了构建 dll 之外还有其他选择(http://stackoverflow.com/questions/3072359/unblocking-a-dll-on-a-company-machine-how)我个人更喜欢自己构建 dll,除非我绝对信任下载的产品。

于 2012-06-19T09:28:53.317 回答